String.prototype.linkify = function() {
this.replace(/((ht|f)tp:\/\/)?([^:\/\s]+)\w+.(com|net|org)/gi, '<a href="$&">$&</a>')
}
与 http://www.google.com <a href="http://yahoo.com" rel="noreferrer noopener nofollow">http://yahoo.com</a> www.facebook.com
它与它们全部匹配,但是如果 facebook 不存在,我希望它在协议(protocol)组前面加上。有没有办法不做两次就可以做到这一点 .replace
?
最佳答案
我会做这样的事情:
String.prototype.linkify = function () {
return this.replace(/((?:ht|f)tp:\/\/)?([^:\/\s]+\w+\.(?:com|net|org))/gi, function (_, protocol, rest) {
var url = (protocol || "http://") + rest
return '<a href="' + url + '">' + url + '</a>'
})
}
(我修复了您的代码的其他几个问题:您缺少 return
并且您使用 .
而不是 来匹配域名周期\.
.)
而且我想我不需要指出这与 URL:s 的一般匹配有多糟糕,因为您的模式存在许多问题。
关于javascript正则表达式解析没有协议(protocol)的url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559833/