javascript正则表达式解析没有协议的网址

时间:2011-09-26 18:51:45

标签: javascript regex url replace

String.prototype.linkify = function() {
this.replace(/((ht|f)tp:\/\/)?([^:\/\s]+)\w+.(com|net|org)/gi, '<a href="$&">$&</a>')
}

http://www.google.com http://yahoo.com www.facebook.com匹配,但是如果不存在,我希望facebook与协议组一起使用。有没有办法在不做两个.replace的情况下做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您实际上不需要匹配FTP URL,则可以假定该链接的“http://”部分。这个正则表达式允许你也使用https。

this.replace(/(http(s)?:\/\/)?(([^:\/\s]+)\.(com|net|org))/gi,
                         '<a href="http$2://$3">http$2://$3</a>')

我不确定你的用例是什么,但我想注意这个正则表达式会在以下网址上失败:

这是因为您使用的是几乎没有硬编码的tld(com,net,org),并且不匹配域之后的任何字符。

答案 1 :(得分:1)

我会做这样的事情:

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匹配的程度有多差。