9

HTML 片段 #1

<div>
</div>
<div>
    <h1>headline</h1>
</div>

HTML 片段 #2

<div></div>
<div><h1>headline</h1></div>

PHP 代码

$doc = new DOMDocument();
$doc->loadHTML($x);
$xpath = new DOMXpath($doc);
$divs = $xpath->query("//div");

foreach ($divs as $div) echo $div->childNodes->length,"<br />";

带有$x =片段#1
1
3的输出

带有$x =片段 #2
0
1 的输出

见工作演示:http ://codepad.viper-7.com/11BGge

我的问题
1. 这怎么可能?
2.如何正确计算子节点DOM

编辑
正如 Silkfire 所说,空白空间被视为文本节点。我设置

$doc->preserveWhiteSpace = false;

但结果还是一样:http ://codepad.viper-7.com/bnG5io

有任何想法吗?

4

3 回答 3

6

只需计算循环中的非文本节点:

$count = 0;
foreach($div->childNodes as $node)    
  if(!($node instanceof \DomText))      
    $count++;

print $count;

使用 xpath:

$nodesFromDiv1 = $xpath->query("//div[1]/*")->length;
$nodesFromDiv2 = $xpath->query("//div[2]/*")->length;

要删除空文本节点,何时preserveWhiteSpace=false不工作(正如我在聊天中建议的那样):

$textNodes = $xpath->query('//text()');

foreach($textNodes as $node)
  if(trim($node->wholeText) === '')
    $node->parentNode->removeChild($node);
于 2013-05-09T21:36:47.293 回答
3

空白被认为是一个节点,因为它是一个text()节点 ( DOMText)。

您可以通过更改foreach循环来完成这项工作:

foreach ($divs as $div) {
    echo $div->childNodes->length - $xpath->query('./text()', $div)->length, '<br>';
}
于 2013-05-09T21:18:19.723 回答
0

Firefox、Chrome 和大多数其他浏览器会将空白或新行视为文本节点,Internet Explorer 不会。检查 这里

于 2013-05-09T21:31:57.057 回答