PHP DOMnodeオブジェクトには、ノードのinnerHTMLのように見える textContent および nodeValue 属性が含まれています。
nodeValue:タイプに応じて、このノードの値
textContent:この属性は、このノードとその子孫のテキストコンテンツを返します。
これら2つのプロパティの違いは何ですか?いつ他の代わりに使用するのが適切ですか?
最終的に違いも知りたかったので、 source を掘り下げて答えを見つけました。ほとんどの場合、識別可能な違いはありませんが、注意する必要があるEdgeのケースがたくさんあります。
_->nodeValue
_と_->textContent
_は両方とも、次のクラス(ノードタイプ)で同一です。
_->nodeValue
_プロパティは、次のクラス(ノードタイプ)に対してNULL
を生成します。
_->textContent
_プロパティは、次のクラスには存在しません。
DOMNameSpaceNode
(文書化されていませんが、_//namespace:*
_セレクターで見つけることができます)_->nodeValue
_プロパティは、次のクラスには存在しません。
参照: dom_node_node_value_read()
および dom_node_text_content_read()
これが理にかなっていることを望みます:
$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"
textContent
とnodeValue
はどちらもエスケープされていないテキストを返します。つまり、<
は<
になります。
textContent
は、すべての子のすべてのコンテンツを連結します。これは重要な違いです。たとえば、Chrome nodeValue
の最大長は65536文字(バイトではない)です。ノードのコンテンツを必要以上に長い値に設定している場合nodeValue
を使用する場合は子ノードを反復しますが、textContent
は連結を実行します。
説明したように、nodeValue
をサポートしないがtextContent
をサポートするDOMクラスもいくつかあります。
nodeValue
は明らかな理由で高速です。ただし、ノード構造が実際に何であるかを正確に知っていない限り、使用しないでください。
textContent
プロパティに値を割り当てたい場合、 PHP <5.6.1 では機能しないことに注意してください。下位互換性のために、代わりにnodeValue
の使用を検討してください。