我正在使用以下功能来匹配给定文本中的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>"); }
解决方法
首先,滚动自己的正则表达式来解析URL是一个可怕的想法.你必须想象这是一个常见的问题,有人写了,调试和
tested一个库,根据
the RFCs. URI是复杂的 – 查看
code for URL parsing in Node.js和维基百科页面
URI schemes.
解析URL有很多边缘案例:international domain names,实际(.museum)与不存在(.etc)TLD,奇怪的标点符号包括parentheses,URL尾部的标点符号,IPV6主机名等.
我看过libraries a ton,尽管有些缺点,还有一些值得使用:
> SoapBox的linkify已经看到了一些认真的努力,a major refactor in June 2015 removed the jQuery dependency.它还有issues with IDNs.
> AnchorMe是claims to be faster和更瘦的新手.一些IDN issues以及.
> Autolinker.js非常具体地列出了功能(例如“将正确处理HTML输入,该实用程序将不会更改anchor()标记内的href属性”).在demo becomes available时,我会给它一些测试.
我已经取消了这个任务的资格的图书馆:
> Django的urlize didn’t handle certain TLDs properly(这是官方list of valid TLDs. No demo.
> autolink-js不会检测到没有http://的“www.google.com”,所以它不太适合用纯文本自动链接“随机URL”(没有方案/协议).
> Ben Alman’s linkify自2009年以来一直保持不变.
如果你坚持正则表达式,那么最全面的就是URL regexp from Component,虽然它会通过查看来错误地检测出一些不存在的两个字母的TLD.