Php 如何通过dom过滤空节点?
我只想获取元素,这些元素中有一些真实文本或子元素节点(而不是空格或Php 如何通过dom过滤空节点?,php,dom,Php,Dom,我只想获取元素,这些元素中有一些真实文本或子元素节点(而不是空格或等) 我尝试了以下html: <p> </p> <div> </div> 然后在get_children函数中,我使用此代码过滤空节点或带有的节点: foreach ($node->childNodes as $child) : if (trim($child->nodeValue) != ""): echo
等)
我尝试了以下html:
<p> </p>
<div> </div>
然后在get_children函数中,我使用此代码过滤空节点或带有
的节点:
foreach ($node->childNodes as $child) :
if (trim($child->nodeValue) != ""):
echo $child->nodeValue; // it returns Â
echo $child->nodeName; // it returns #text
array_push($children_type, $child->nodeType);
endif;
endforeach;
print_r($children_type);
它只为返回文本和数组([0]=>3)
。那么我如何过滤它们呢?我知道#text是文本的特殊节点名
事先做一些解释:您看到的原因是您的HTML文档被视为UTF-8,但您将其显示为ISO 8859-1。非中断空间
在UTF-8中编码为两个字节:0xC2 0xA0
。在ISO 8859-1中,它只是0xA0
,而0xC2
表示
现在,您可以在trim()
中指定应该修剪哪些字符,这样就可以包含非中断空格(默认字符也必须显式添加):
目前你的函数没有过滤功能,所以我不确定你到底想对这些项目做什么。但剩下的应该很简单,例如:
- 对节点类型不是text或值不是空的子节点进行计数
- 如果计数>0,则保留元素
更新
您的其余代码有点粗糙,因此我制作了一个最简单的工作示例:
测试代码:
$html = <<<HTML
<body>
<div>
<p>not-empty</p>
<p> </p>
<div> </div>
</div>
</body>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//*') as $node) {
if (!count($node->childNodes) || trim($node->nodeValue, " \n\r\t\0\xC2\xA0")==='') {
echo 'to filter: ' . $node->getNodePath() . "\n";
}
}
那么你又做错了什么。请看一下我的更新。你能看一下这个代码吗?现在检查第12行,将$node替换为$child(两次)。谢谢fab:)它真的很有帮助
if (trim($child->nodeValue, " \n\r\t\0\xC2\xA0") !== ""):
// value is not empty
$html = <<<HTML
<body>
<div>
<p>not-empty</p>
<p> </p>
<div> </div>
</div>
</body>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//*') as $node) {
if (!count($node->childNodes) || trim($node->nodeValue, " \n\r\t\0\xC2\xA0")==='') {
echo 'to filter: ' . $node->getNodePath() . "\n";
}
}