PHP DOM textContent vs nodeValue?

时间:2012-09-12 03:46:12

标签: php html dom

PHP DOMnode对象包含textContentnodeValue属性,这两个属性似乎都是节点的innerHTML。

  

nodeValue:此节点的值,具体取决于其类型

     

textContent:此属性返回此节点及其后代的文本内容。

这两个属性有什么区别?什么时候使用一个而不是另一个?

5 个答案:

答案 0 :(得分:41)

我终于想知道其中的差异,所以我挖了source并找到答案;在大多数情况下,没有明显的区别,但是你应该注意一些边缘情况。

->nodeValue->textContent对于以下类(节点类型)都是相同的:

->nodeValue属性为以下类(节点类型)生成NULL

以下类不存在->textContent属性:

  • DOMNameSpaceNode(未记录,但可以在//namespace:*选择器中找到)

以下类不存在->nodeValue属性:

另请参阅:dom_node_node_value_read()dom_node_text_content_read()

答案 1 :(得分:16)

希望这有意义:

$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 - The value of this node, depending on its type

答案 2 :(得分:4)

textContentnodeValue都返回未转义的文字;即&lt;变为<

textContent将所有孩子的所有内容联系在一起。这是一个重要的区别;例如,在Chrome中,nodeValue的最大长度为65536个字符(不是字节);如果您已经将节点的内容设置为长于某个节点的内容,则需要使用nodeValue来迭代子节点,而textContent将为您执行连接。

如上所述,还有一些DOM类不支持nodeValue但支持textContent

由于显而易见的原因,

nodeValue速度更快;但除非你确切知道节点结构究竟是什么,否则不要使用它。

答案 3 :(得分:0)

如果您想为textContent属性注释分配一个值,它不适用于PHP < 5.6.1。为了向后兼容,请考虑使用nodeValue

答案 4 :(得分:-3)

他们是一回事。 (mikespook的NULL来自非DOMNode)