繁体   English   中英

如何仅删除带有正则表达式的嵌入式图像?

[英]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删除此类内联图像。 我猜这样做的方法将是一个正则表达式,即使过度使用正则表达式似乎在Stack Overflow社区中不受欢迎,因为它经常被用来代替其他工具更好地工作并且是针对特定的目的。

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

因此,如何使用正则表达式通过PHP过滤掉内联图像? 或者,如果有更好的工具来执行此操作,那是什么?

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

这是一个起点,将其扩展为您喜欢的:

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

确保使用ignore case标志运行它并在你将其置于现场之前测试它的地狱。

一般而言,正则数据并不令人沮丧。 它们是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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM