How to make auto hyperlink regex ignore img tags with src?
我有以下正则表达式,它将所有纯文本超链接替换为实际的锚标记。
1 2 3
| $acturl = '~(?:(https?)://([^\\s<]+)|(www\\.[^\\s<]+?\\.[^\\s<]+))(?<![\\.,:])~i';
$content = preg_replace($acturl, '$0', $content); |
但是,这段代码的问题在于它也将 img 标签转换为锚点。
例如,
<img src="https://link.com"> 将变为 <img src="https://link.com">.
有没有办法让这个正则表达式忽略图像并且只对纯文本 URL 进行操作?
- 模式末尾否定的lookbehind有什么意义?您可以通过添加一组输入字符串和您的确切预期结果来改善您的问题。您的示例输入是 img 标签,而不是纯文本网址。
-
@Nick 请记住关闭超级重复的问题。我被限制为 3 以结束,但很容易有 10 页已经回答了这个问题。
-
@mickmackusa 你当然是正确的。您是否保留了一个列表,以便您不必总是搜索它们?
-
@Nick 不,我只是使用问题中的措辞在谷歌上搜索它们。然后,当我使用问题中存在的关键字找到一堆解决方案时,我不会觉得自己像个混蛋。今天人们真的很生气我的锤击。我的帐户连续减去 10,因为我的问题没有发表评论。嗯。
-
@mickmackusa 太糟糕了。我想我必须期待的东西!
你可以在你的正则表达式的开头添加一个否定的look-behind:
如果 URL 前面有字符 src=" 或 src=',它将阻止 URL 匹配。
3v4l.org 上的演示
请注意,如果您使用解析器(例如 DOMDocument),您可以通过仅替换文本节点中的链接来避免此问题。
- 代码会像这样吗? $acturl = '~(?<!src=")(?:(https?)://([^\\s<]+)|(www\\.[^\\s<]+?\\.[^\\s<]+)??)(?<![\\.,:])~i'; 它似乎做同样的事情。
-
@Osman 抱歉,意味着包含演示链接(我现在已经添加了),但是是的,那将是新代码。
-
谢谢尼克,这似乎可行-尽管有没有办法让它也可以与单引号一起使用?目前它只适用于 <img src=" 而不是 <img src='。
-
@Osman 也刚刚更新了单引号的答案和演示。