我使用下面的函数来匹配给定文本中的URL,并将它们替换为HTML链接。正则表达式工作得很好,但目前我只替换第一场比赛。
我怎样才能替换所有的URL?我想我应该使用exec命令,但我并没有真正知道如何做到这一点。
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}发布于 2014-02-21 04:46:07
首先,滚动自己的regexp来解析URL是一个糟糕的想法。您必须想象这是一个足够常见的问题,有人已经为它编写、调试和已测试了一个库,据区域资源中心说。URI是复杂的--查看Node.js中的URL解析代码和URI方案上的维基百科页面。
在解析URL时,有大量的边缘情况:国际域名、实际(.museum)与不存在(.etc) TLD、奇怪的标点符号(包括括号 )、URL末尾的标点符号、IPV6主机名等等。
我看过一吨 of 库,尽管有一些缺点,但还是有一些值得使用的地方:
href属性”)。当一个演示可供使用时,我会抛出一些测试。我很快就取消了用于此任务的库:
如果您坚持正则表达式,最全面的是来自组件的URL regexp,尽管它会错误地检测到一些不存在的双字母the。
发布于 2008-09-01 10:00:52
用链接替换URL(回答一般问题)
问题中的正则表达式忽略了很多边缘情况。在检测URL时,最好使用专门的库来处理国际域名、新的TLDs (如.museum )、圆括号和URL内部和末尾的其他标点符号,以及许多其他边缘情况。有关其他一些问题的解释,请参阅Jeff的博客文章http://www.codinghorror.com/blog/2008/10/the-problem-with-urls.html。
对匹配库的最佳总结是在中

(截至2014年2月)
“使正则表达式替换多个匹配”(回答具体问题)
在正则表达式的末尾添加一个"g“以启用全局匹配:
/ig;但这只解决了正则表达式只替换第一个匹配的问题。不要使用这段代码。
发布于 2010-10-08 11:50:19
我对Travis的代码做了一些小小的修改(只是为了避免任何不必要的重声明--但它对我的需求非常有用,所以工作非常好!):
function linkify(inputText) {
var replacedText, replacePattern1, replacePattern2, replacePattern3;
//URLs starting with http://, https://, or ftp://
replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
replacedText = inputText.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');
//URLs starting with "www." (without // before it, or it'd re-link the ones done above).
replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
replacedText = replacedText.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');
//Change email addresses to mailto:: links.
replacePattern3 = /(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)/gim;
replacedText = replacedText.replace(replacePattern3, '<a href="mailto:$1">$1</a>');
return replacedText;
}https://stackoverflow.com/questions/37684
复制相似问题