我正在尝试在PHP中使用XPath,但我得到的元素太多了。这是我的代码:
libxml_use_internal_errors(true);
$document = new DOMDocument;
$document->strictErrorChecking = false;
$document->loadHTML($text);
$xpath = new DomXPath($document);
$placeholders = $xpath->query('//div[starts-with(@class, "waf-ph-")]');
print '$placeholders->length: ' . $placeholders->length;
只有一个元素与查询匹配。一。没有一个。但这是我的输出:
$placeholders->length: 7
我正在使用loadHTML,因为当我完成编码时,我无法完全控制输入,我无法保证符合标准的XHTML。我打算使用Tidy,但我还是不想依赖它。但是只有一个div匹配XPath。
进一步调查似乎表明它与七次被发现的元素相同。
发生了什么事?
编辑:DOM文件的源是一个HTML文件,某处包含以下内容(这是一个虚拟地址):
<div class="waf-ph-https\:\/\/aserver\.com\/apath\/app\.php5">
<p class="notification">This is to be substituted.</p>
</div>
文件中找不到字符串“waf-ph-”。
编辑:
尝试以下方法:
foreach ($document->placeholders as $node) print $document->saveXML($node);
七次返回上述DIV的文本。
答案 0 :(得分:1)
如果我使用您提供的代码段,我会得到一个结果。
对于这个XML:
$text = <<< XML
<root>
<div class="waf-ph-1"></div>
<div class="waf-ph-2"></div>
<div class="waf-ph-3"></div>
<div class="waf-ph-4"></div>
</root>
XML;
您将获得给定XPath的四场比赛。
对于这个XML:
$text = <<< XML
<root>
<div class="waf-ph-1"></div>
<div class="wbf-ph-2"></div>
<div class="wcf-ph-3"></div>
<div class="wdf-ph-4"></div>
</root>
XML;
你只会得到一个。你的代码是正确的。这必须是你的HTML。另请注意,//div
将匹配任何<div>
,无论其在文档中的位置如何。以下XML还将为您的代码返回4个找到的节点:
$text = <<< XML
<root>
<div class="waf-ph-1">
<div class="waf-ph-2">
<div class="waf-ph-3">
<div class="waf-ph-4">
</div></div></div></div>
</root>
XML;
答案 1 :(得分:0)
ircmxaell关于使用spl_object_hash()
的评论确实解决了我的问题并且表明,一次,编译器(或解释器)真的有问题。他应该对这个问题感到荣幸。除此之外,我写这个答案是为了归功于他。