PHP的XPath返回太多元素

时间:2010-08-20 17:14:53

标签: php dom xpath

我正在尝试在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的文本。

2 个答案:

答案 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()的评论确实解决了我的问题并且表明,一次,编译器(或解释器)真的有问题。他应该对这个问题感到荣幸。除此之外,我写这个答案是为了归功于他。