2011-12-27 2 views
2

나는 뒤죽박죽이다! 나는 googled하고 읽고 읽고 읽고 뭔가 틀림 없음을 정말 바보 내가 틀렸다고 확신 해요. 이것은 Greasemonkey 스크립트에서 나의 삶에 대해 시작할 수없고 제대로 수행 할 수 없다. 나는이 일치하도록 노력하고있어 :링크 텍스트를 얻기위한 정규식

여기
<a href="/browse/post/SOMETHING/">**SOMETHING** (1111)</a> 

내가 무엇을 사용하고 있어요 :

var titleRegex = new RegExp("<a href=\"/browse/post/\d*/\">(.*) \("); 

은 내가 이스케이프 문자의 어떤 종류를 누락거야? 하지만 파이어 폭스가 오류를 내지 않도록 알아낼 수는 없습니다.

나는 http://regexpal.com/를 사용하여 정규 표현식 생성 - 파이어 폭스 오류 콘솔에서 내가받을 "종료되지 않은 괄호"여기

+5

에 http : // 유래.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454 – asawyer

+0

읽기 쉽도록 항상 리터럴 정규 표현식을 선호합니다. ''여기에 문자열 ".match (/ match me/i)가 있습니다." – tomfumb

+0

이런 식으로 XML 파서를 사용하는 방법에 대해 더 알고 싶습니다. 기본적으로 기존 스크립트를 수정하여 필요한 작업을 수행하려고합니다. ** 올바른 ** 방식으로 수행하는 greasemonkey 스크립트의 좋은 예가 있습니까? – spazzed

답변

4

리터럴 정규식의 문자열에서 정규 표현식을 구축 백 슬래시를 두 배로 늘려야합니다.

그런 다음 \d*은 숫자와 일치합니다. SOMETHING은 그냥 자리 표시 자라고 가정하고 있지만 숫자 만 포함하면 실패합니다.

또한 (.*) (greedy) 대신 (.*?) (게으른)을 사용해야합니다. 그렇지 않으면 너무 많이 일치 할 수 있습니다. 아마도 ([^(]*)이 더 좋을 것입니다.

실제 텍스트에 대해 더 많이 알지 못하더라도 말하기는 어렵습니다. 모두

모든 :

var titleRegex = new RegExp("<a href=\"/browse/post/\\d*/\">([^(]*) \\("); 
+0

이것은 완벽하게 작동하는 것 같습니다. 나는 여전히 혼란 스럽다. 문자열의 첫 번째 인용 부호는 하나의 백 슬래시 만 필요하지만 "("는 이중 문자를 필요로 하는가?) 이유는 무엇입니까? – spazzed

+1

'\ "'인용 부호를 이스케이프 처리하여 문자열에서 사용하십시오. \\ 역 슬래시를 이스케이프 처리하므로'\ ('()는 캡쳐 그룹을 열지 않고 리터럴'(')과 일치하도록 괄호를 이스케이프 처리 함) –

+0

문자열을 이스케이프 처리하여 JavaScript가이를 문자열 리터럴 내에서 따옴표로 해석하도록합니다. 정규 표현식은 따옴표를 허용하기 때문에 정규식 내에서 이스케이프 할 필요가 없습니다. "("는 이스케이프 처리해야합니다. 정규식 안에서 문자열이 아니므로 "\\ ("를 포함하는 JavaScript 문자열이 필요하지만 JavaScript는 백 슬래시 문자를 사용하므로 문자열에 "\\\"(자바 스크립트가 "\\ ("및 정규식 피드를 포함하는 문자열. –

1

간단한 수정의를 :

/href=\".*?\">(.*?)\(/ 
2

일반적인 생각은, HTML의 문자열을 문서 (dom elements의 나무) 다음 정보를 추출하는 데 횡단로를 구문 분석하는 것입니다. 링크는

을했다 경우

<a href="/browse/post/something/"><b>something</b> else</a> 

먼저 다음 앵커 태그를 찾기 위해 트리를 탐색 :

anchor.textContent // returns "something else" 

이있을 경우에도, 요소에서 텍스트를 추출 할 간단합니다 트리 아래에 텍스트가 포함 된 다른 요소. 이것은 또한 정규식 예제보다 강력합니다. 누군가가 클래스 속성을 앵커에 추가했다고 가정하면, 수용된 응답의 정규식은 앵커 태그와 더 이상 일치하지 않을 것입니다. 그러나 순회 기반 솔루션은 여전히 ​​작동 할 것입니다. 간단한 경우

, 당신은 다음을 통과, 다음 HTML 문자열로 innerHTML을 설정 사업부를 만들 수 있습니다

var html = '<p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a>'; 
var div = document.createElement("div"); 
div.innerHTML = html; 
var anchors = div.getElementsByTagName("a"); 
for (var i = 0; i < anchors.length; i++) { 
    console.log(anchors[i].textContent); 
} 

이의 더 정교한 버전은 jQuery(string) function에 패키지되어 제공됩니다.

var html = '<div><p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a></div>'; 
jQuery(html).find("a").each(function() { 
    console.log(jQuery(this).text()); 
}); 

라이브 예 : http://jsfiddle.net/ygcFM/

+0

대단한 답변입니다. jquery와 DOM에 관한 책을 집어 들고이 것을 배우기위한 시간. 내 자바 스크립트는 기껏해야 "초보자"입니다. 또한 - jsfiddle.net 링크에 대한 이중 감사원! 나는 전에 그것을 보지 않고 있었다. ... 훌륭한 도구!! – spazzed

관련 문제