【问题标题】:Regex URL detection javascript正则表达式 URL 检测 javascript
【发布时间】:2017-12-30 12:12:56
【问题描述】:

我正在使用这个正则表达式来检测文本字符串中的 URL:

/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6}|:[0-9]{3,4})\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)/gi

结合此功能,将检测到的字符串替换为链接:

function linkify(text) {
    return text.replace(urlRegex, function(url) {
        return "<a href=" + url + ">" + url + "</a>";
    });
}

两者都在这里找到:Detect URLs in text with JavaScript

这适用于大多数链接,但是诸如 www.fatsoma.com/flatline-cardiff 和 检测到tickets.partyforthepeople.org/events/3633,但无处链接,在检测到的链接前面添加本地路径,例如http://127.0.0.1:8000/filelocation/tickets.partyforthepeople.org/events/3633

这和链接开头没有Https等协议有关吗?

【问题讨论】:

  • 浏览器决定在地址栏中隐藏协议前缀,造成了无穷无尽的破坏。有效的完整绝对 URL 必须以 http://https:// 或类似名称开头。
  • 正则表达式看起来很时髦,我很确定它会同时提供误报和误报。此外,根据上下文,可能需要进行一些解码才能获得实际的 URL。并处理相对 URL 组合。而您的替代品缺少引号以及转义。
  • 我注意到您的函数没有引用 href 值。更好的是:return &lt;a href="${url}"&gt;${url}&lt;/a&gt;(将文本放在反引号内,我不能在评论中使用它们)
  • @jcaron 是的,它给了我一些用省略号分隔的单词的误报。

标签: javascript regex url


【解决方案1】:

这和链接开头没有Https等协议有关吗?

是的。

如果不存在,请尝试添加协议:

function linkify(text) {
    return text.replace(urlRegex, function(url) {
        if (url.indexOf('http://') === 0 || url.indexOf('https://') === 0) {
             return "<a href='" + url + "'>" + url + "</a>";
        }
        return "<a href='//"+url+"'>"+url+"</a>";
    });
}

【讨论】:

  • 这解决了这些链接的问题,谢谢!不过,正则表达式会抛出误报,所以我必须努力解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2015-03-12
相关资源
最近更新 更多