2

(スペースなどではなく)実際のテキストまたは子要素ノード含む要素のみを取得したい。 

私は次のhtmlを試しました:

<p>&nbsp;</p>
<div>&nbsp;</div>

そして私はこれまでこのコードを試しました:

$dom = new DOMDocument;

$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;

$i = 0;
while (is_object($html_synch = $dom->getElementsByTagName("body")->item($i))) {
    foreach ($html_synch->childNodes as $node) {
        if ($node->nodeName != "script" && $node->nodeName != "style" &&
                XML_COMMENT_NODE != $node->nodeType):
            get_children($node);
        endif;
    }
    $i++;
}

そして、get_children関数で、このコードを使用して、空のノードまたはノードを&nbsp;次のようにフィルタリングしています。

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);

#text  and Array ( [0] => 3 )だけ戻ります<p>&nbsp;</p>。では、どうすればそれらをフィルタリングできますか?そして、#textがテキストの特別なノード名であることを私は知っています。

デモへのリンク:

4

1 に答える 1

2

事前にいくつかの説明: あなたが見ている理由は、HTML ドキュメントが UTF-8 として扱われているのに、ISO 8859-1 として表示されているからです。非改行スペース&nbsp;は、UTF-8: で 2 バイトとしてエンコードされます0xC2 0xA0。ISO 8859-1 では、単に0xA0, while を0xC2意味しますÀ

これで、どの文字をトリミングするかを で指定できるtrim()ようになりました。そのため、改行しないスペースを含めることができます (デフォルトの文字も明示的に追加する必要があります)。

if (trim($child->nodeValue, " \n\r\t\0\xC2\xA0") !== ""):
    // value is not empty

現時点では、あなたの関数はフィルタリングしていないので、これらのアイテムで正確に何をしたいのかわかりません。ただし、残りは簡単なはずです。たとえば、次のようになります。

  • ノード タイプがテキストではない、または値が空でない子を数える
  • カウント > 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";
  }
}

テスト出力:

to filter: /html/body/div/p[2]
to filter: /html/body/div/div

デモへのリンク

于 2013-02-21T09:29:15.373 に答える