如何计算DOMDocument

时间:2018-10-09 23:23:08

标签: php

使用PHP 7.1,我想计算此字符串根目录中的节点数:

<p>Lorem</p>
<p>Ipsum</p>
<div>Dolores</div>
<b>Amet</b>

使用以下PHP:

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($content);
$root = $dom->documentElement;
$children = $root->childNodes;
var_dump($children)

返回:

object(DOMNodeList)#4 (1) {
  ["length"]=>
  int(1)
}

我不明白为什么HTML字符串仅返回1个节点。此外,我无法遍历节点。

3 个答案:

答案 0 :(得分:2)

作记录(尽管接受了其他答案,但这是列出子节点:-的正确方法)。其中包括文本节点,人们忘记了这些文本节点!

<?php

$content = " 
  <p>Lorem</p> 
  <p>Ipsum</p> 
  <div>Dolores</div> 
  <b>Amet</b> 
 ";

$dom = new DOMDocument;
$dom->loadHTML($content);
$nodes=[];
$bodyNodes = $dom->getElementsByTagName('body');  // returns DOMNodeList object
foreach($bodyNodes[0]->childNodes as $child)      // assuming 1 <body> node
{
    $nodes[]=$child->nodeName;
}

print_r($nodes);

输出此内容,说明要点...:

Array
(
    [0] => p
    [1] => #text
    [2] => p
    [3] => #text
    [4] => div
    [5] => #text
    [6] => b
    [7] => #text
)

答案 1 :(得分:1)

与@bart聊天愉快之后,我们找到了解决方案。

$content = " 
  <p>Lorem</p> 
  <p>Ipsum</p> 
  <div>Dolores</div> 
  <b>Amet</b> 
 ";

  $dom = new DOMDocument;
  $dom->loadHTML($content);
  $allElements = $dom->getElementsByTagName('*');
  echo $allElements->length;

  echo "<br />";

  $node = array();
  foreach($allElements as $element) {
      if(array_key_exists($element->tagName, $node)) {
          $node[$element->tagName] += 1;
      } else {
           $node[$element->tagName] = 1;
         }
  }
  print_r($node);

ps:默认情况下,会添加html和body标记并对其进行计数,结果会增加2。

答案 2 :(得分:1)

好吧,我已经输入了这个答案,所以我还是要在这里添加它。

您必须遍历DOMNodeList object的内容,这不是var_dump()和朋友可以看到的数组结构。使用foreach进行迭代时,您将获得DOMNode object的实例。 DOMNodeList中的元素计数存储在length属性中。

$content = " 
<p>Lorem</p>
<p>Ipsum</p>
<div>Dolores</div>
<b>Amet</b>
";

$dom = new DomDocument();
$dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$allElements = $dom->getElementsByTagName('*');
echo "We found $allElements->length elements\n";

foreach ($allElements as $element) {
    echo "$element->tagName = $element->nodeValue\n";
}