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


How can I remove only inline images with a regular expression?

我有很多用户生成的内容,其中包含内联图像,样式为:

<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。我猜这样做的方法是正则表达式,尽管过度使用regex似乎在Stack Overflow社区中不受欢迎,因为它经常被用来代替其他工作更好的工具,并且是为特定目的而设计的。

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

那么,我如何使用正则表达式来过滤掉只是内联图像与PHP?或者,如果有更好的工具来做这件事,它是什么?

正则表达式听起来不错。只要让它匹配data:image/gif和其他类型的图像,当且仅当它们出现在img标签内时,您想要删除它们。

这是一个起点,根据你的喜好展开:

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

请确保在运行它时带有忽略大小写标志,并在运行它之前对它进行彻底的测试。

通常不反对正则表达式。它们和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);
}