使用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个节点。此外,我无法遍历节点。
答案 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";
}