如何用链接替换普通网址?

2022-08-29 23:11:10

我正在使用下面的函数来匹配给定文本中的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>"); 
}

答案 1

首先,滚动自己的正则表达式来解析URL是一个可怕的想法。根据RFC,您必须想象这是一个足够常见的问题,有人已经为它编写,调试和测试了一个库。URI很复杂 - 查看Node.js中的URL解析代码以及有关URI方案的维基百科页面。

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

我已经看过大量的,尽管有一些缺点,但仍有一些值得使用:

我很快取消了此任务的资格的库:

如果您坚持使用正则表达式,最全面的是来自组件的URL正则表达式,尽管它会通过查看它来错误地检测一些不存在的双字母TLD。


答案 2

将 URL 替换为链接(一般问题的答案)

问题中的正则表达式遗漏了很多边缘情况。在检测 URL 时,最好使用专门的库来处理国际域名、新 TLD(如 、URL 内部和末尾的括号和其他标点符号)以及许多其他边缘情况。请参阅 Jeff Atwood 的博客文章 The Problem With URL,了解其他一些问题的解释。.museum

URL匹配库的最佳摘要Dan Dascalescu的答案+100
中(截至2014年2月)


“使正则表达式替换多个匹配项”(对特定问题的回答)

在正则表达式的末尾添加“g”以启用全局匹配:

/ig;

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