web-dev-qa-db-ja.com

PHP DOM textContent vs nodeValue?

PHP DOMnodeオブジェクトには、ノードのinnerHTMLのように見える textContent および nodeValue 属性が含まれています。

nodeValue:タイプに応じて、このノードの値

textContent:この属性は、このノードとその子孫のテキストコンテンツを返します。

これら2つのプロパティの違いは何ですか?いつ他の代わりに使用するのが適切ですか?

41
Xeoncross

最終的に違いも知りたかったので、 source を掘り下げて答えを見つけました。ほとんどの場合、識別可能な違いはありませんが、注意する必要があるEdgeのケースがたくさんあります。

_->nodeValue_と_->textContent_は両方とも、次のクラス(ノードタイプ)で同一です。

_->nodeValue_プロパティは、次のクラス(ノードタイプ)に対してNULLを生成します。

_->textContent_プロパティは、次のクラスには存在しません。

  • DOMNameSpaceNode(文書化されていませんが、_//namespace:*_セレクターで見つけることができます)

_->nodeValue_プロパティは、次のクラスには存在しません。

参照: dom_node_node_value_read() および dom_node_text_content_read()

42
Ja͢ck

これが理にかなっていることを望みます:

$doc = DOMDocument::loadXML('<body><!-- test --><node attr="test1">old content<h1>test</h1></node></body>');
var_dump($doc->textContent);
var_dump($doc->nodeValue);
var_dump($doc->firstChild->textContent);
var_dump($doc->firstChild->nodeValue);

出力:

string(15) "old contenttest"
NULL
string(15) "old contenttest"
string(15) "old contenttest"

理由: nodeValue-タイプに応じて、このノードの値

16
mikespook

textContentnodeValueはどちらもエスケープされていないテキストを返します。つまり、&lt;<になります。

textContentは、すべての子のすべてのコンテンツを連結します。これは重要な違いです。たとえば、Chrome nodeValueの最大長は65536文字(バイトではない)です。ノードのコンテンツを必要以上に長い値に設定している場合nodeValueを使用する場合は子ノードを反復しますが、textContentは連結を実行します。

説明したように、nodeValueをサポートしないがtextContentをサポートするDOMクラスもいくつかあります。

nodeValueは明らかな理由で高速です。ただし、ノード構造が実際に何であるかを正確に知っていない限り、使用しないでください。

4
Adam Leggett

textContentプロパティに値を割り当てたい場合、 PHP <5.6.1 では機能しないことに注意してください。下位互換性のために、代わりにnodeValueの使用を検討してください。

0
Valerio Bozz