我想在HTML元素中获取注释,但是显然,注释不在DOM元素的层次结构中。
例如,
<!-- FIRST -->
<div id="parent">
<!-- SECOND -->
<span id="child">
<!-- THIRD -->
</span
</div>
[使用$xpath->query
的第二个参数时无效。
$comments=$xpath->query('//comment()');
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}
// Query (intended) within <div id="parent">
$el = $doc->getElementById('parent');
$comments=$xpath->query('//comment()',$el);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}
// Query (intended) within <div id="child">
$el = $doc->getElementById('child');
$comments=$xpath->query('//comment()',$el);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}
并且所有三个循环的输出都相同,
FIRST
SECOND
THIRD
FIRST
SECOND
THIRD
FIRST
SECOND
THIRD
必须相对于给定的上下文节点选择注释。
xpath表达式中的//
(后代或自身)前缀正在选择节点中任何位置的每个注释,而与上下文无关。
我建议使用.//
(自身,后代或自身)xpath表达式进行相对搜索,以在提供的上下文中进行搜索。
例如,
<?php
$xml = <<< XML
<!-- FIRST -->
<div id="parent">
<!-- SECOND -->
<span id="child">
<!-- THIRD -->
</span>
</div>
XML;
$dom = new DOMDocument;
$dom->loadHTML($xml);
$xpath = new DOMXpath($dom);
文档中的所有注释
<?php
$comments = $xpath->query('.//comment()', $dom);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}
FIRST
SECOND
THIRD
[div#parent
中的所有注释
<?php
$el = $dom->getElementById('parent');
$comments = $xpath->query('.//comment()', $el);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}
SECOND
THIRD
[span#child
中的所有注释
<?php
$el = $dom->getElementById('child');
$comments = $xpath->query('.//comment()', $el);
foreach($comments as $comment){
echo $comment->nodeValue.PHP_EOL;
}
THIRD