我有很多用户生成的内容,其中包含内联图像,样式为:
<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);
}