You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除img标签除src和alt外的所有属性 PHP正则问题求助

移除HTML img标签中除src和alt外的所有属性

我有一段包含多张图片的HTML字符串,每张图片带有class、id、style等多种属性。我希望移除img标签中除src和alt之外的所有属性。

处理前的代码示例

<img title="How to" alt="How to" src="windows_en.jpg" loading="lazy" width="1280" height="720" class="img-first">

期望输出

<img alt="How to" src="windows_en.jpg">

我尝试了以下PHP正则代码,但效果不佳,恳请帮助:

$desc = preg_replace("/(<img\s)[^>]*((src|alt)=\S+)[^>]*/i", "$1$2$3", $desc);

解决方案:用DOM解析替代正则

别用正则处理HTML,正则很容易因为HTML的灵活写法(比如属性顺序、空格、单/双引号、属性值含特殊字符)出错,用PHP的DOMDocument来处理才是稳定可靠的方式。

以下是完整的处理代码:

';

// 初始化DOMDocument,设置忽略HTML解析错误(避免不规范HTML报错)
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($desc, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_clear_errors();

// 获取所有img标签
$imgs = $dom->getElementsByTagName('img');

// 遍历每张图片,保留src和alt属性,移除其他属性
foreach ($imgs as $img) {
    // 先把属性集合转成数组,避免遍历过程中修改集合导致的问题
    $attributes = [];
    foreach ($img->attributes as $attr) {
        $attributes[] = $attr->name;
    }
    
    foreach ($attributes as $attrName) {
        if (!in_array(strtolower($attrName), ['src', 'alt'])) {
            $img->removeAttribute($attrName);
        }
    }
}

// 输出处理后的HTML
echo $dom->saveHTML();
?>

代码说明

  1. LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD:避免DOMDocument自动添加<html>和<body>标签
  2. 把属性集合转成数组再遍历:直接遍历$img->attributes时修改集合会导致遍历异常,转成数组后可以安全处理
  3. 不区分大小写检查属性名:确保SRC、Alt这类写法也能被正确识别

你之前的正则问题在于:只能匹配到src或alt中的一个属性,没法同时保留两个,而且处理不了属性顺序、空格等情况,所以效果不好。用DOM解析就能完美解决这些问题。


内容的提问来源于stack exchange,提问作者PCcloob.Ir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:07:24