Php 如何通过dom过滤空节点?

Php 如何通过dom过滤空节点?,php,dom,Php,Dom,我只想获取元素,这些元素中有一些真实文本或子元素节点(而不是空格或等) 我尝试了以下html: <p>&nbsp;</p> <div>&nbsp;</div> 然后在get_children函数中,我使用此代码过滤空节点或带有的节点: foreach ($node->childNodes as $child) : if (trim($child->nodeValue) != ""): echo

我只想获取元素,这些元素中有一些真实文本子元素节点(而不是空格或
等)

我尝试了以下html:

<p>&nbsp;</p>
<div>&nbsp;</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>&nbsp;</p>
  <div>&nbsp;</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>&nbsp;</p>
  <div>&nbsp;</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";
  }
}