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属性只有
如果你的需求是仅匹配完全独立的类名(比如只有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
相关产品推荐
相关产品推荐

