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

PHP如何通过XPath精准筛选class属性包含指定独立单词的HTML元素

PHP中使用XPath匹配class属性含指定独立词的元素方案

核心XPath表达式

根据你要求的匹配规则(匹配class作为独立词干,仅允许后接连字符-、空格或属性结尾,排除衍生字符串),可直接使用以下XPath查询语句:

//div[
  normalize-space(@class) = "class"
  or starts-with(normalize-space(@class), "class ")
  or starts-with(normalize-space(@class), "class-")
  or contains(@class, " class ")
  or contains(@class, " class-")
]

规则说明:

  • normalize-space(@class) 会自动去掉属性值前后的空格,同时把多个连续空格合并为单个,避免多余空格干扰匹配
  • 覆盖了所有符合要求的场景:
    • class属性只有class一个值
    • class属性以class 开头(后面接其他类名)
    • class属性以class-开头(后面接连字符后缀)
    • class属性中间包含独立的class类名
    • class属性中间包含class-开头的类名

如果你的需求是仅匹配完全独立的类名(比如只有class="a class b"这种class单独作为一个类名的情况,不需要匹配class-show),可以使用更通用的标准XPath写法:

//div[contains(concat(" ", normalize-space(@class), " "), " class ")]

完整实现代码

<?php
// 忽略HTML不规范导致的libxml警告
libxml_use_internal_errors(true);
$doc = new DomDocument();
// 加载你的HTML内容,设置编码避免中文乱码
$doc->loadHTML('<?xml encoding="utf-8" ?>' . $你的HTML内容变量);
$xpath = new DOMXPath($doc);

// 代入上面的XPath表达式
$classtoremove = $xpath->query('//div[
  normalize-space(@class) = "class"
  or starts-with(normalize-space(@class), "class ")
  or starts-with(normalize-space(@class), "class-")
  or contains(@class, " class ")
  or contains(@class, " class-")
]');

// 遍历删除匹配到的元素
foreach ($classtoremove as $node) {
    $node->parentNode->removeChild($node);
}

// 输出处理后的HTML
echo $doc->saveHTML();
// 清空错误缓存
libxml_clear_errors();
?>

常用调整

  • 如果要匹配所有标签的元素而非仅div,把//div改为//*即可
  • 如果要匹配的目标词不是class,直接替换表达式中所有对应的class字符串即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:04