2010-01-20 34 views
0

对不起,再次打扰你们,但这是我的困境。使用正则表达式从Javascript中的段落文本中提取1个或多个超链接

必须有一个“更好”的正则表达式来标识段落文本中的HTML链接(文本中可以有多个HTML链接)。我如何提取所有的链接,并在JavaScript中锚定它?

我尝试(在JavaScript)是这样的:

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)。 结果:我只得到第一个超链接而不是第二个...... 有没有人做过类似或更好的事情,我可以利用?

在此先感谢。

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags 这应该回答你所有的问题。 – 2010-01-20 08:31:59

+0

别担心......我以前读过甜蜜的诗歌,但Alsciende为我提供了正确的答案。 – 2010-01-20 09:04:47

回答

2

使用 “G” 修改器:

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

谢谢,这工作! :-) – 2010-01-20 09:03:30

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个链接...只有第一个。 – 2010-01-20 08:31:10

+0

看看我编辑的回复。我修改了你的代码。 – stepanian 2010-01-20 08:52:33

+0

results [1]给了我“http”,这样就不会从文本字符串中检索第2个url。 – 2010-01-20 09:02:02

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})*)?/g; 

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

这里urlPattern是预编译的,而不是每次编制的正则表达式函数被调用,因此导致性能下降。

+0

确实,但extractURLs(...)不是唯一可用的函数,还有一些函数,如使用urlPattern的isValidURL(url),以及一些以其他表达式预先结束或后期结束的函数。 – 2010-01-20 13:13:56

+0

实际上您的urlPattern将无法编译.... 解决方案:var urlPattern = /(https?ftp)://(www\.)((([a-zA-Z0-9.-] + \){1,} [A-ZA-Z] {2,4} |。本地主机))|((\ d {1,3} \){3}(\ d {1,3})) )(:(\ 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并将\\替换为\ – 2010-01-20 13:21:54

相关问题