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

发布于 2024-12-06 14:40:00 字数 394 浏览 0 评论 0 原文

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 的情况下做到这一点?

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

with http://www.google.com http://yahoo.com www.facebook.com it matches them all, however I want facebook to be prepended with the protocol group if it does not exist. Is there a way to do this without doing two .replace ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青春有你 2024-12-13 14:40:00

我会做这样的事情:(

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 匹配得有多差。

I would do something like this:

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>'
  })
}

(I fixed a couple of other problems with your code: you were missing a return and you were matching the domain name period using . rather than \..)

And I assume I don’t need to point out how poorly this will match URL:s in general, due to a number of problems with your pattern.

后知后觉 2024-12-13 14:40:00

如果您实际上不需要匹配 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),并且不匹配域后的任何字符。

If you don't actually need to match FTP URLs, you can just assume the "http://" section of the link. This regex does that, while allowing you to also use https.

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

I'm not sure what your use case is, but I'd like to note this regex will fail on the following urls:

This is because you're using few hardcoded tlds (com, net, org), and aren't matching any characters after the domain.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文