【问题标题】:How to turn urls padded by space into links如何将空格填充的网址转换为链接
【发布时间】:2012-09-08 03:40:35
【问题描述】:

我有以下代码用于将文本中的 http URL 转换为锚标记。它正在寻找以 http 开头的任何内容,并被空格(或输入的开头/结尾)包围

function linkify (str) {
    var regex = /(^|\s)(https?:\/\/\S+)($|\s)/ig;
    return str.replace(regex,'$1<a href="$2" target="_blank">$2</a>$3')
}

// This works
linkify("Go to http://www.google.com and http://yahoo.com");

// This doesn't, yahoo.com doesn't become a link
linkify("Go to http://www.google.com http://yahoo.com");

它不起作用的情况是如果我在两个链接之间只有一个空格。我假设是因为两个链接之间的空间不能用来匹配两个 URL,在第一次匹配之后,URL 后面的空间已经被消耗掉了。

玩:http://jsfiddle.net/NgMw8/

有人可以建议一种正则表达式方法吗?我可以自己扫描字符串,寻找一种正则表达式的方式(或者某种不需要我自己扫描字符串并自己构建新字符串的方式。

【问题讨论】:

  • 为什么要以空格开头?为什么不让您的正则表达式模式以 http 开头并以它找到的第一个空格匹配结束。然后您的第二个链接将被匹配,因为它包含 http 直到匹配到空格。
  • @Mark 因为我不希望“你http://ww.google.com 成为链接”
  • 在这种情况下,您将不会成为链接的一部分。 google.com 会,你只是链接前的一个字符串。我认为这将是一种更准确的查找有效链接的方法。
  • @Mark,我基本同意,但是如果您查看此评论,XXXhttp://www.google 并没有成为链接。这就是它的具体实施方式
  • 不错,但其他人的做法还有改进的余地。如果有人粗心评论并忘记在“单击此处”和 url 之间放置一个空格,如果我们知道它是有效的,我们没有理由无法匹配 url,因为它包含协议、域和 TLD .真正的挑战是知道网址是否包含顶级域名。

标签: javascript regex url


【解决方案1】:

不要捕获最终的\s。这样,第二个 url 将根据需要匹配前面的\s

function linkify (str) {
    var regex = /(^|\s)(https?:\/\/\S+)/ig;
    return str.replace(regex,'$1<a href="$2" target="_blank">$2</a>')
}

http://jsfiddle.net/NgMw8/3/

【讨论】:

  • 我不希望 XXXhttp://www.google.com 之类的东西成为链接,就像它没有成为此评论中的链接一样
  • @JuanMendes:我明白了,请检查我的编辑。另外,为什么需要$3?你可以在替换中放一个空格。
  • 如果我删除最后的\s,那么google.comXXX之类的东西就会变成一个链接。 3 美元只是添加回 URL 后面的任何内容。嗯......也许不是......检查
  • 对了,最后的空间不用再截取了。谢谢若昂。
  • @JuanMendes:但这就是您当前的正则表达式已经做的事情。为了阻止它这样做,您必须为您的正则表达式添加更多复杂性,以匹配顶级域 (tld),例如 \.(com|org|net) 等。否则,您无法仅使用 \S+ 知道,如果 .comXXX.net 是有效的 tld。
【解决方案2】:

在匹配您的最终$|\s 时,只需使用正向预测,如下所示:

var regex = /(^|\s)(https?:\/\/\S+)(?=($|\s))/ig;

【讨论】:

  • 很好,但正如 João 指出的那样,没有必要在末尾加上 ($|\s),因为正则表达式的最后一个组件是 \S+
【解决方案3】:

如果有任何 html 元素粘在 url 上,则不会起作用 ...

类似的问题及其答案HERE

一些解决方案可以处理诸如“test.com/anothertest?get=letsgo”之类的 url 并附加 http://

  • 可以采取解决方法来处理 https 和其他 tld ...

【讨论】:

  • 不确定你在说什么......我的问题是专门关于用空格填充的网址。你发布的链接不是我问的。
  • 好吧,它处理必须转换为链接标签的填充 url,url 可以带有 http 前缀,也可以嵌套在 html 中,...我认为它可以帮助。 ..
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2018-01-07
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多