正则表达式删除链接但不在img标记内

时间:2012-09-21 01:04:47

标签: php regex

我经营一个邮寄网站。我设置了正则表达式来替换html电子邮件正文中的链接。

我用:

// remove entire anchors

$body=preg_replace('/<a[^>]*>(.*)<\/a>/iU','[Link Removed]', $body);

// remove links not wrapped in an anchor tag

$body= preg_replace('!((?:www|http://)[^ ]+)!', '[Link Removed]', $body);

我遇到的问题是在html中放置了一个图像。当然,img src会被[Link Removed]取代,并且电子邮件中会显示损坏的图像。如果它是图像的src,我不希望替换链接。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

试试这个:

$body= preg_replace('~(?<!src=["\'])(?:www|http://)[^ ]+~', '[Link Removed]', $body);

答案 1 :(得分:0)

我希望您了解使用正则表达式处理HTML时遇到的问题?不幸的是,PHP没有简单的替代方案

如果您使用否定后视,则可以忽略src属性

中的网址

此外,必须将www选项增强为(?<!/)wwwwww后面没有斜杠)

这将做你想要的事情

$body= preg_replace('_(?<!src=["\'])(?:http://|(?<!/)www)\S+_', '[Link Removed]', $body);

但请注意,没有什么可以阻止字符引用被用作属性值的分隔符,因此图像可能看起来像

<img src=&#34;http:www.mysite.com/image.png&#34;>

但很明显这不太可能