PHP DOM - 计数子节点? [英] PHP DOM - counting child nodes?

查看:116
本文介绍了PHP DOM - 计数子节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Output with $x = snippet #1
1
3

输出与 $ x = 片段#2

0

1

Output with $x = snippet #2
0
1

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

我的问题

1.怎么可能?

2.如何正确使用 DOM

编辑

作为Silkfire说,空格是考虑了一个文本节点。我设置

EDIT:
as Silkfire said, empty space is considered a text node. I set

$doc->preserveWhiteSpace = false;

但结果仍然相同: http://codepad.viper-7.com/bnG5io

任何想法?

推荐答案

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

Just count non-text nodes in your loop:

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

print $count;






使用xpath:


Using xpath:

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






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


To remove empty text nodes, when preserveWhiteSpace=false is not working (as I suggested in the chat):

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

foreach($textNodes as $node)
  if(trim($node->wholeText) === '')
    $node->parentNode->removeChild($node);

这篇关于PHP DOM - 计数子节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆