2012-06-29 4 views
1

널 (null) 결과 : <(a*)\b[^>]*>.*?</\1>자바 스크립트 정규식 내가이 정규 표현식 쓴

이 정규 표현식 테스트 사이트에서 테스트 : http://gskinner.com/RegExr/?2tntr

정규 표현식의 요점은 HTML 사이트를 통해 가서 모두를 찾을 수 있습니다 링크. 그런 다음이를 Array에 반환하여 조작해야합니다.

정규 표현식 테스트 사이트에서는 완벽하게 작동하지만 내 사이트에 자바 스크립트가 삽입되면 null을 반환합니다.

자바 스크립트는 다음과 같습니다

var data = $('#mainDivOnMiddleOfPage').html(); 

var pattern = "<(a*).*href=.*>.*</a>"; 
var modi = "g"; 

var patt = new RegExp(pattern, modi); 
var result = patt.exec(data); 

jQuery를 페이지의 내용을 가져옵니다. 이것은 테스트되고 검증되었습니다.

질문은 왜 JavaScript에서 null을 반환하지만 regexp 테스터에서 반환해야 할 사항입니까? 전용 (http로 시작하는)

<a[^>]*?\bhref=['\"](.*?)['\"] 

절대 링크 :

+2

는 –

+0

을 구문 분석 HTML에 대한 정규식을 사용하지 않는? –

+0

나는 HTML 콘텐츠를 얻기 위해 $ .ajax를 사용하고 있는데, 이것은 A 요소를 얻기 위해 jQuery를 사용할 수 없다는 것을 의미한다. 그러나 만약 내가 = 할 수 있다면 좋은 생각이다.) –

답변

1

모든 <a> 링크

var html = '<a href="test.html">'; 
var m = html.match(/<a[^>]*?\bhref=['"](.*?)['"]/); 
print (m[1]); 

참조 대구를 테스트 : 코드 자바 스크립트

<a[^>]*?\bhref=['\"](http.*?)['\"] 

e here.

+0

(로컬 링크이므로 http가 검색 구문에 포함되지 않습니다.) –

+0

@ BjørnØyvindHalvorsen - 그 이유는 내 대답에서 두 가지 옵션을 모두 볼 수있는 이유입니다 ... –

+0

여전히 null 만 반환합니다 .... 나는 완전히 엉망이되었습니다 ... –

1

내가 같은 일을하려면 다음 코드를 사용하고 나를 위해 작동

var data = document.getElementById('mainDivOnMiddleOfPage').textContent; 

var result = data.match(/<(a*).*href=.*>.*<\/a>/); 
​ 
+0

data.match는 함수가 아닙니다 .. . 난 일부 외부 liberaries을해야 할 수도 있습니다 –

+0

죄송합니다 ... 일치 doen't JS 존재는 couterpart은'exec'입니다입니다 – rcdmk

+0

그냥, 당신이하는 TextContent을 얻을 필요가 대답에 수정을 추가 해주기 – ama2

1

을 그것을 밖으로 시도 "정규 표현식의 포인트는 사이트의 HTML을 통과하고 모든 링크를 찾는 것입니다. 그런 다음이를 배열에서 반환해야 조작 할 수 있습니다. "

다른 정규식 응답을 추가하지 않지만 단순히 html이 아닌 문서를 보유하고 있으면 링크 컬렉션을 걷는 것이 더 쉽다는 것을 지적하고 싶습니다. 즉 모든 <a href=""> 년대를 제외한 모든 <area> 요소를 포함 : 나는 당신이 원하는 것을 생각하기 때문에, 가서 여기를 게시가는

for (var link, links = document.links, n = links.length, i=0; i<n; i++){ 
    link = links[i]; 
    switch (link.tagName){ 
     case "A": 
      //do something with the link 
      break; 
     case "AREA": 
      //do something with the area. 
      break; 
    } 
} 
1

을 - 그것은하지만, 정규식 솔루션이 아닙니다. 당신은 exec() 방법으로 사용하기 전에 전화를해야

patt.compile(); 

:

$(function(){ 
    $.ajax({ 
     url: "test.htm", 
     success: function(data){ 
      var array_of_links = $.makeArray($("a",data)); 
      // do your stuff here 
     } 
    }); 

}); 
0

귀하의 문제는 당신이 당신의 정규식을 컴파일하지 않는 것입니다.

+0

'compile()'은 [더 이상 사용되지 않습니다.] (https://developer.mozilla.org/en/JavaScript/Reference/Deprecated_Features#RegExp_Methods), RegExp 생성자 이외에는 아무것도하지 않습니다. 따라서'exec()'를 실행하기 전에 호출 할 필요는 없습니다. – Utkanos

+0

IE와 같은 일부 브라우저에는 필요하지만 모든 경우에 필요하지는 않습니다. 그가 지적한 사례로 IE에서 직접 테스트 해보십시오. – rcdmk

1

나는 답변을 선택했습니다. 그러나 현재 REGEX 솔루션은 태그와 일치하지만 실제 HREF는 격리되어 있지 않음을 언급 할 가치가 있습니다.

세계에서 g 플래그가 지정된 경우 REGEX를 약간 단순하게 구현하면 하위 그룹을 캡처 할 수 없기 때문에 여기에서 JavaScript가 떨어집니다.이번 라운드

한 가지 방법은 REGEX 교체 콜백을 악용하는 것입니다. 이렇게하면 태그가 아닌 HREF 링크 만 연결됩니다.

var html = document.body.innerHTML, 
    links = []; 
html.replace(/<a[^>]*?href=('|")(.*?)\1/gi, function($0, $1, $2) { 
    links.push($2); 
}); 
//links is now an array of hrefs 

는 또한 반드시 개구 양쪽을 견적하고 혼합하지 않는 단일 또는 이중 폐쇄되어, 즉을 href 특성을 닫고 백 기준을 사용한다.

(!) 참고 : 다른 언급으로, 가능하면, 당신은 DOM이 아닌 REGEX 싶어. 이미 jQuery- 왜`$ ("#의 mainDivOnMiddleOfPage a를")`사용하지 사용하는 경우

관련 문제