2014-10-21 2 views
0

나는 긴 문자열의 섹션을 새로운 내용으로 대체하면서 다소 복잡한 정규 표현식으로 간단한 것을 해결하려고 노력 해왔다. 이 태스크는 다른 곳에서 제공된 html 내의 하이퍼 링크를 대체하여 출력 전에 사용자 정의 함수를 통해 전달합니다.Javascript 정규식 바꾸기 결과

function replaceHyperlinks(html){ 
    if(!source) return ""; 
    var str = source; 

    // Modify <a> tag 
    str = str.replace(/<a.*href="(.*?)".*>(.*?)<\/a>/gi, "<a onclick=\"javascript:openURL('$1')\" href=\"#\">$2</a>"); 
    return str; 
} 

교체가 순서대로 작동하는 것 같습니다. 문제는 첫 번째 경기에만 해당되며, 갑작스럽게 끝나고 첫 번째 경기 후 나머지 부분을 던지기 때문입니다.

나는 주위를 둘러 보았다했지만, 아무도 내가 무엇을 볼 수있는이 문제가있는 것 같다

...

답변

0

당신은 확실히 사용할 수 있도록해야하는 "?" 매 경기마다, 그렇지 않으면 모든 것이 탐욕스럽게 일치합니다.

/<a.*href="(.*?)".*>(.*?)<\/a>/gi 

"?"없이 "?" 패턴의 첫 번째와 마지막 인스턴스 사이의 모든 것을 먹게합니다.

는이 걸릴 :

이제
<a href="/main">Main</a> bunch of text or something <a href="/whatever">whatever</a> 

는, 그 표현과 일치하는 괄호를 추가하면 일치를 보여줍니다 : 그것은 전체 경기의로

text = '<a href="/main">Main</a> bunch of text or something <a href="/whatever">whatever</a>' 
text.match(/<a(.*)href="(.*?)"(.*)>(.*?)<\/a>/i) 
[ 
"<a href="/main">Main</a> bunch of text or something <a href="/whatever">whatever</a>", 
" href="/main">Main</a> bunch of text or something <a ", 
"/whatever", 
"", 
"whatever" 
] 

은 배열의 첫 번째 항목을 무시합니다. 두 번째 항목은 첫 번째 부모 집합의 일치 항목이며 너무 많이 잡는 것을 볼 수 있습니다.

text.match(/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i) 
["<a href="/main">Main</a>", " ", "/main", "", "Main"] 

그게 당신이 원하는 것입니다.