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?

EDIT
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 に答える
0

Firefox、Chrome、およびその他のほとんどのブラウザーは、空の空白または改行をテキスト ノードとして扱いますが、Internet Explorer はそう ではありません。

于 2013-05-09T21:31:57.057 に答える