代码之家  ›  专栏  ›  技术社区  ›  bart

如何统计DOMDocument中的所有节点

php
  •  1
  • bart  · 技术社区  · 6 年前

    使用PHP7.1,我想计算这个字符串根中的节点数:

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

    $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)
    }
    

    3 回复  |  直到 6 年前
        1
  •  2
  •   bcperth    6 年前

    记录在案(尽管其他答案被接受,这里是列出孩子的正确方法 :-). 这包括人们忘记的文本节点!

    <?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
    )
    
        2
  •  2
  •   Sigma    6 年前

    在与@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);
    

        3
  •  1
  •   miken32 Jennifer McCarthy    6 年前

    您必须遍历 DOMNodeList object ,它不是一个可以用 var_dump() 还有朋友。使用迭代时 foreach 你得到一个 DOMNode object 多姆诺德利斯特 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";
    }