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

PHP中保留指定HTML标签且移除所有属性的最快最简实现方法

PHP 移除非允许HTML标签并清除保留标签属性的最优方案

内置的strip_tags()确实只能保留标签但会留下属性,正则处理HTML又容易踩贪婪匹配或特殊字符的坑,这里推荐两种方案,优先用标准DOM解析的方式:

方案一:DOMDocument 解析(推荐)

DOM解析是处理HTML的标准方式,能正确应对嵌套标签、特殊属性值等场景,不会出现正则的匹配漏洞,步骤如下:

  1. 加载HTML内容,处理编码和解析警告
  2. 遍历所有元素节点,过滤非允许标签
  3. 对保留标签清除所有属性
  4. 提取并清理最终的HTML内容

代码实现

function cleanAllowedTagsWithoutAttributes($rawHtml, $allowedTags = ['p', 'b', 'i', 'br']) {
    // 初始化DOM文档,处理UTF-8编码问题
    $dom = new DOMDocument();
    libxml_use_internal_errors(true); // 抑制HTML解析时的警告(比如不规范标签)
    $dom->loadHTML('<?xml encoding="UTF-8">' . $rawHtml);
    libxml_clear_errors();

    $xpath = new DOMXPath($dom);
    $allElements = $xpath->query('//*'); // 获取所有元素节点

    foreach ($allElements as $element) {
        $tag = strtolower($element->nodeName);
        
        // 移除不在允许列表中的标签,保留其内部内容
        if (!in_array($tag, $allowedTags)) {
            $parent = $element->parentNode;
            while ($element->firstChild) {
                $parent->insertBefore($element->firstChild, $element);
            }
            $parent->removeChild($element);
        } else {
            // 清除保留标签的所有属性
            while ($element->hasAttributes()) {
                $element->removeAttribute($element->attributes->item(0)->name);
            }
        }
    }

    // 提取处理后的内容,去除DOM自动添加的html/body等包裹标签
    $cleanedHtml = $dom->saveHTML();
    $cleanedHtml = preg_replace('/^<!DOCTYPE.+?>/', '', $cleanedHtml);
    $cleanedHtml = str_replace(['<html>', '</html>', '<body>', '</body>'], '', $cleanedHtml);
    
    return trim($cleanedHtml);
}

// 测试示例
$testContent = '<div class="wrapper"><p style="color:blue">这是<b class="bold">加粗</b>文本<br id="line-break"></p><script>alert("xss")</script></div>';
echo cleanAllowedTagsWithoutAttributes($testContent);
// 输出:<p>这是<b>加粗</b>文本<br></p>

优势

  • 能正确处理嵌套标签、不规范的HTML结构
  • 不会出现正则的贪婪匹配、属性值含特殊字符的匹配错误
  • 兼容性和稳定性远高于正则方案

方案二:正则表达式(仅适用于简单场景)

如果你的HTML结构非常简单(无复杂嵌套、属性值不含特殊字符),可以用strip_tags()配合正则快速处理,但要明确其局限性:

代码实现

function quickCleanHtml($rawHtml, $allowedTags = ['p', 'b', 'i', 'br']) {
    // 第一步:保留允许标签,移除其他所有标签
    $filteredHtml = strip_tags($rawHtml, '<' . implode('><', $allowedTags) . '>');
    // 第二步:清除保留标签的所有属性
    $tagPattern = '/<(' . implode('|', $allowedTags) . ')\s+[^>]+>/i';
    $cleanedHtml = preg_replace($tagPattern, '<$1>', $filteredHtml);
    // 处理自闭合标签(比如<br/>)
    $selfClosingPattern = '/<(' . implode('|', $allowedTags) . ')\s*\/>/i';
    $cleanedHtml = preg_replace($selfClosingPattern, '<$1>', $cleanedHtml);
    
    return $cleanedHtml;
}

局限性

  • 若属性值包含>、嵌套引号等特殊字符,会导致匹配失败
  • 无法处理复杂的嵌套标签结构
  • 维护成本高,需要不断调整正则适配边缘情况

总结

优先选择DOMDocument方案,它是处理HTML的正统方式,能覆盖绝大多数场景;正则仅作为极端简单场景下的临时方案,不推荐用于生产环境中复杂的HTML处理。

内容的提问来源于stack exchange,提问作者Klax Cuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:31