如何仅使用正则表达式删除内嵌图像?

时间:2011-12-09 14:53:07

标签: php regex image preg-replace pcre

我有很多用户生成的内容,其中包含内嵌图像,采用以下样式:

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb2
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1hwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjd7sJAgVGoEgAwXEQA7" 
width="16" height="14" alt="embedded folder icon">

有些图像是gif,有些是png,但也可能是其他图像类型。

我希望能够使用PHP删除这样的内联图像。我猜这样做的方法将是一个正则表达式,即使过度使用正则表达式似乎在Stack Overflow社区中不受欢迎,因为它经常被用来代替其他工具更好地工作并且是针对特定的目的

但是,对于这种情况,我可以想到除了strip_tags之外没有其他工具可以完成这项工作,但我确实希望保留未内联编码的图像。

那么,如何使用正则表达式过滤掉PHP内嵌图像?或者,如果有更好的工具来做到这一点,它是什么?

2 个答案:

答案 0 :(得分:2)

正则表达对我来说听起来不错。只要匹配data:image/gif以及要删除的其他类型的图片,当且仅当它们出现在img标记内时才会被删除。

这是一个起点,根据自己的喜好进行扩展:

<img[^>]* src=['"]?data:image/gif[^>]*>

确保使用ignore case标志运行它并在你将其置于实际状态之前测试它。

答案 1 :(得分:1)

一般而言,正则数据并不令人沮丧。它们是PHP工具箱中的任何其他工具。一旦您使用正则表达式解析HTML,问题便开始出现。对于小的“已知格式”片段,您可以侥幸逃脱。但作为一般的HTML操作工具,正则表达式无法保证您将获得良好的结果,因为HTML不是常规语言。

与大多数HTML操作一样,使用DOM:

$dom = new DOMDocument;
$dom->loadHTML(...);
$xp = new DOMXPath($dom);

$images = $xp->query("//img[starts-with(@src,'data:image']");

foreach($images as $img) {
    $img->parentNode->removeChild($img);
}