0

我有一个与文本字符串中的 http 匹配并从文本创建工作 URL 的现有替换。

工作示例:

var Text = "Visit Gmail at http://gmail.com"
var linkText = Text.replace(/http:\/\/\S+/gi, '<a href="$&">$&</a>');
document.write(linkText);

输出:

通过http://gmail.com访问 Gmail

问题:

当链接出现在句子的末尾并且标点符号错误地附加到 URL 的末尾时,就会出现问题。

有人可以建议扩展我的正则表达式(或者在转换后添加第二个替换)来克服这个问题吗?

我认为正确的答案将包括/\W$/g在我的原始正则表达式中添加一些内容,但我看不出如何将其应用于整个字符串中的一个单词。

一如既往,非常感谢任何帮助。

谢谢,皮特

问题链接示例

所有这些都应该解析到http://gmail.com的链接

请注意,有些可能以斜杠结尾,然后是标点符号,而另一些则以标点符号结尾,紧跟在域名后面。

4

3 回答 3

1

尝试

/http:\/\/(.(?![.?] |$))*/

我的逻辑是,如果最后一个字符是点,或者问号后跟空格或字符串结尾,则不需要它。

var Text = "Visit Gmail at http://gmail.com"
var linkText = Text.replace(/http:\/\/(.(?![.?](?:\s|$)))*./gi, '<a href="$&">$&</a>');
document.write(linkText);

"Visit Gmail at <a href=\"http://gmail.com\">http://gmail.com</a>"

编辑:

这可能会更好(它现在不匹配空白)

http:\/\/(.(?!(?:[.?](?: |$))))*.
于 2012-05-14T15:23:18.780 回答
0

您可以考虑尾随不需要的字符,无论是否剥离它们。

两者的替代品是捕获缓冲区 1:<a href="$1">$1<\/a>

这也假设你可以做lookbehind。虽然我不确定客户端 JS 是否可以进行后向断言。

去除不需要的字符

/(http:\/\/\S+)(?<![\/.,?!])[\/.,?!]*/

或者,留下不需要的字符

/(http:\/\/\S+)(?<![\/.,?!])/

备用,使用前瞻

跳闸

/(http:\/\/\S+?(?=[\/.,?!]+(?:\s|$)|\s|$))[\/.,?!]*/  

离开

/(http:\/\/\S+?(?=[\/.,?!]+(?:\s|$)|\s|$))/
于 2012-05-14T15:39:27.433 回答
0

为什么不只使用否定字符类?

/http://\S+[^.,?!]/gi

于 2012-05-14T15:06:32.343 回答