preg_replace用于在特殊字符后添加分号的URL

时间:2014-12-12 00:52:23

标签: php regex preg-replace

我有这个表达式,用于识别网址并将其转换为链接:

$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结合,而且替换后的字符串添加了分号。例如:

  • [AAA] .COM。
  • [BBB] .COM,
  • [CCC] .COM?

  • [XXX] .COM&安培;

  • [YYY] .COM&#39;
  • [ZZZ] .COM&#34;

成为

  • [AAA] .COM 即可。
  • [BBB] .COM
  • [CCC] .COM

  • [XXX] .COM&安培;

  • [YYY] .COM&#39;
  • [ZZZ] .COM&#34;

(粗体部分表示现在链接的内容 - 以纯文本形式插入分号。)成功忽略句号,逗号和其他标点符号。 &符号和引号作为链接的一部分包含在内,并且在结尾处插入纯文本分号,即使它不在匹配的文本中。

我搜索并搜索了解原因,但我无法找到解释它的任何内容。我已经在preg_replace测试站点上测试了表达式,并且没有导致任何问题 - 实际上,它完全正常工作,只匹配URL而不是结束字符。它可能很简单,我不知道正则表达式或preg_replace,但我不知道如何成功地忽略URL末尾的所有标点符号/特殊字符,并且没有一些奇怪的在&amp;,&#39;或&#34;之后插入分号。

1 个答案:

答案 0 :(得分:1)

最后只是放下负面的看法:

/my_url_regex(?<![.!?,'\"])/