我有这个表达式,用于识别网址并将其转换为链接:
$string = preg_replace("/(\A|[^=\]'\"a-zA-Z0-9])((http|ftp|https|ftps|irc):\/\/[^<>\s()]+)/i", "\\1<a href=\"\\2\">\\2</a>", $string);
除非在URL末尾有标点符号(例如,当URL在句子末尾时),否则它的工作完全正常。它将标点符号视为URL的一部分,这显然意味着该链接无法正常工作。
为了解决这个问题,我在表达式的末尾添加了一个单词边界(\ b)。它很棒 - 句号,逗号等不再添加到链接中!除了&amp; &#39; 和&#34; 这三个字符外。这些不仅与URL结合,而且替换后的字符串添加了分号。例如:
[CCC] .COM?
[XXX] .COM&安培;
成为
[CCC] .COM
[XXX] .COM&安培;
(粗体部分表示现在链接的内容 - 以纯文本形式插入分号。)成功忽略句号,逗号和其他标点符号。 &符号和引号作为链接的一部分包含在内,并且在结尾处插入纯文本分号,即使它不在匹配的文本中。
我搜索并搜索了解原因,但我无法找到解释它的任何内容。我已经在preg_replace测试站点上测试了表达式,并且没有导致任何问题 - 实际上,它完全正常工作,只匹配URL而不是结束字符。它可能很简单,我不知道正则表达式或preg_replace,但我不知道如何成功地忽略URL末尾的所有标点符号/特殊字符,并且没有一些奇怪的在&amp;,&#39;或&#34;之后插入分号。
答案 0 :(得分:1)
最后只是放下负面的看法:
/my_url_regex(?<![.!?,'\"])/