如何从文本节点xpath中排除html注释?

时间:2019-04-03 01:34:20

标签: php html xpath

我具有以下html结构:

<a>
    <div>
        <div>
            <span>
                text node 1<br>
                text node 2  <!--//comments-->
            </span>
        </div> 
    </div>
</a>

通过以下查询,我得到了第二个节点,但是如何使该节点不包括注释?

$spanx = $xpath->query('//a/div/div/span/text()[2]');
$span = $spanx->item($l)->nodeValue;
echo "<td>".$span."</td></tr>";

我有那个结果:

text node 2 //comments

我搜索:

text node 2

1 个答案:

答案 0 :(得分:3)

我已经在本地主机上测试了以下内容。我创建了名为DOM_with_comment.html的文件,其中包含:

<a>
    <div>
        <div>
            <span>
                text node 1<br>
                text node 2  <!--//comments-->
            </span>
        </div> 
    </div>
</a>

当我跑步时:

<?php
$doc = new DOMDocument;
libxml_use_internal_errors(true);
$doc->preserveWhiteSpace = false;
$doc->loadHTMLFile('DOM_with_comment.html');
$xpath = new DOMXPath($doc);
echo "<pre>";
foreach ($xpath->query('//a/div/div/span/text()') as $item) {
    var_dump($item->nodeValue);
}

输出为:

string(29) "
                text node 1"
string(31) "
                text node 2  "
string(14) "
            "

因此,通过从xpath查询访问第一个合格结果[0],然后显示trim()的{​​{1}}和->nodeValue(),可以看出没有注释或空白在目标子字符串的两侧。

var_export()

p.s。如果您的输入不是来自文件而是变量,则其工作方式相同:

var_export(trim($xpath->query('//a/div/div/span/text()[2]')[0]->nodeValue));
// outputs: 'text node 2'