我有很多用户生成的内容,其中包含内嵌图像,采用以下样式:
<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内嵌图像?或者,如果有更好的工具来做到这一点,它是什么?
答案 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);
}