PHP中使用DOMXPath查询无法匹配iframe标签是什么原因?
问题原因及修正方案
你代码里一共有三处核心错误导致匹配失败:
- 误用CSS选择器语法写XPath规则
PHP的DOMXPath遵循XPath 1.0标准,不支持CSS属性选择器里的*=包含匹配写法,要判断src属性包含指定字符串,需要使用XPath内置的contains()函数,规则写为contains(@src, '.example.com/hello/')。 - 节点查询路径错误
你写的查询规则只匹配当前上下文节点的直接子iframe节点,而DOMDocument::loadHTML()在解析HTML内容时,会自动补全<html>、<body>等基础标签结构,你传入的iframe实际是body标签的子节点,根节点下没有直接的iframe元素,自然匹配不到。
正确写法需要添加//前缀,//表示递归查询整个文档所有层级下符合条件的iframe节点。 - 节点内容读取错误
你代码中用$node->nodeValue读取iframe内容,iframe标签本身的nodeValue为空值,如果你需要获取src属性的值,应该调用getAttribute('src')方法。
修正后的完整代码如下:
$content = 'whatever <iframe style="display:none;" src="https://www.example.com/hello/id"></iframe>'; $dom = new DOMDocument(); // 关闭解析HTML时的警告提示,避免不规范HTML触发报错 libxml_use_internal_errors(true); $dom->loadHTML($content); libxml_clear_errors(); $xp = new DOMXpath($dom); $nodes = $xp->query("//iframe[contains(@src, '.example.com/hello/')]"); foreach($nodes as $node){ echo $node->nodeName ." : ". $node->getAttribute('src'), PHP_EOL; }
运行后输出结果为:
iframe : https://www.example.com/hello/id
内容的提问来源于stack exchange,提问作者user2203703
相关产品推荐
相关产品推荐

