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


preg_replace for URLs adding semicolons after special characters

我有这个表达式,用于识别URL并将它们转换为链接:

$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(。它工作得很好 - 句点、逗号等不再添加到链接中!除了三个字符 &'"。这些不仅与 URL 合并,而且替换的字符串会添加一个分号。例如:

  • [aaa].com。
  • [bbb].com,
  • [CCC].com?

  • [xxx].com&

  • [yyy].com'
  • [zz].com">

成为

  • [aaa].com
  • [bbb].com
  • [CCC].com

  • [xxx].com&;

  • [yyy].com';
  • [zzz].com">;

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

我搜索了又搜索以找出原因,但我找不到任何解释它的东西。我已经在preg_replace测试器站点上测试了表达式,它不会在那里引起任何问题 - 事实上,它完全按照应有的方式工作,只匹配 URL 而不是结束字符。这可能是一些简单的事情,我不知道正则表达式或preg_replace,但我不知道如何成功忽略 URL 末尾的所有标点符号/特殊字符,并且不要在 &、' 或"之后插入一些奇怪的分号。

只是在最后放一个负面的回头:

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