首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用链接替换普通URL?

问如何用链接替换普通URL?
EN

Stack Overflow用户
提问于 2008-09-01 09:58:49
回答 24查看 291.6K关注 0票数 484

我使用下面的函数来匹配给定文本中的URL,并将它们替换为HTML链接。正则表达式工作得很好,但目前我只替换第一场比赛。

我怎样才能替换所有的URL?我想我应该使用exec命令,但我并没有真正知道如何做到这一点。

代码语言:javascript
复制
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>"); 
}
EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2014-02-21 04:46:07

首先,滚动自己的regexp来解析URL是一个糟糕的想法。您必须想象这是一个足够常见的问题,有人已经为它编写、调试和已测试了一个库,据区域资源中心说。URI是复杂的--查看Node.js中的URL解析代码和URI方案上的维基百科页面。

在解析URL时,有大量的边缘情况:国际域名、实际(.museum)与不存在(.etc) TLD、奇怪的标点符号(包括括号 )、URL末尾的标点符号、IPV6主机名等等。

我看过一吨 of 库,尽管有一些缺点,但还是有一些值得使用的地方:

我很快就取消了用于此任务的库:

如果您坚持正则表达式,最全面的是来自组件的URL regexp,尽管它会错误地检测到一些不存在的双字母the。

票数 392
EN

Stack Overflow用户

发布于 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“以启用全局匹配:

代码语言:javascript
复制
/ig;

但这只解决了正则表达式只替换第一个匹配的问题。不要使用这段代码。

票数 287
EN

Stack Overflow用户

发布于 2010-10-08 11:50:19

我对Travis的代码做了一些小小的修改(只是为了避免任何不必要的重声明--但它对我的需求非常有用,所以工作非常好!):

代码语言:javascript
复制
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;
}
票数 172
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档