2010-01-20 2 views
0

불편을 끼쳐 드려 죄송합니다. 그러나 여기에 내 딜레마가 있습니다.정규 표현식을 사용하여 Javascript의 단락 텍스트에서 하이퍼 링크를 하나 이상 추출합니다.

단락 텍스트에서 HTML 링크를 식별하는 데 "더 나은"정규 표현식이 있어야합니다 (텍스트에 HTML 링크가 두 개 이상있을 수 있음). 어떻게 모든 링크를 추출하고 자바 스크립트에 앵커합니까? (자바 스크립트)

내 시도는 다음과 같이이다 :

var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?"; 

function extractURLs(s) { 
    return s.match(new RegExp(urlPattern)); 
} 

//s is of type String 

//For testing... 
var text = "Check this video out http://ww w.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY"; 
alert(extractURLs(text)); 

(하이퍼 링크에 공간이 의도적으로 SO에 질문을 게시 할 수 있도록 여기에 추가되었습니다). 결과 : 나는 단지 첫 번째 하이퍼 링크를 얻지 만 두 번째 하이퍼 링크는 얻지 못합니다 .... 아무도 내가 활용할 수있는 비슷하거나 더 좋은 것을 만들었습니까? 사전에

감사합니다. 오히려 매번 정규식을 컴파일하는 것보다, 미리 컴파일

function extractURLs(s) { 
    return s.match(new RegExp(urlPattern, "g")); 
} 
+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags 이 질문에 대한 답변을 제공해 드릴 것입니다. –

+0

걱정 마세요 ... 전에는 달콤한시를 읽었지만 Alsciende는 저에게 정확한 답을 제공했습니다. –

답변

2

는 "g"수정을 사용하여 함수가 호출되므로 성능이 향상됩니다.

+0

감사합니다. :-) –

0
var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?"; 


function extractURLs(s) { 
    return s.match(new RegExp(urlPattern)); 
} 

var text = "Check this video out http://www.youtube.com/watch?v=y3U3R3b1dOg or http://www.youtube.com/watch?v=sX6Vm0MoPCY"; 
var results = extractURLs(text); 

alert(extractURLs(results[0] + ", " + results[1])); 
+0

제가 아는 것은 .... 그러나 그것은 텍스트에 2 개의 링크를 반환하지 않습니다 ... 오직 첫 번째 것. –

+0

내 편집 된 응답을 확인하십시오. 나는 당신의 코드를 수정했다. – stepanian

+0

results [1] 텍스트 문자열에서 두 번째 URL을 검색하지 않도록 "http"를 제공합니다. –

0

으로 작성하는 것이 좋습니다, 여기 urlPattern

var urlPattern = /(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/[email protected]]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?/g; 

function extractURLs(s) { 
    return s.match(urlPattern); 
} 

:

+0

사실 그렇지만 extractURLs (...)만이 유일하게 사용할 수있는 함수는 아니며 urlPattern을 사용하는 isValidURL (url)과 다른 표현식과 함께 끝나거나 끝난 함수가 있습니다. –

+0

실제로 urlPattern은 컴파일에 실패합니다 .... 솔루션 : var urlPattern = /(https?tftp) //()-(A-)A-Z0-9.-] (\ d {1,3} \.) {3} (\ d {1,3})) {1,} [a-zA-Z]) : ([(a + d +))? ((a-zA-Z0-9 -._ ~! $ & '() * +,; = : @ /] | % [0-9A-F] {2 }) *)? (\? ([a-zA-Z0-9 -._ ~! $ & '() * +,; = : /? @] | % [0-9A-F] {2}) *)? (# ([a-zA-Z0-9._-] | % [0-9A-F] {2}) *)? /g을 제거하고 \\을 \ –

관련 문제