PHP DOM textContent vs nodeValue?

Xeo*_*oss 41 html php dom

PHP DOMnode对象包含textContentnodeValue属性,它们似乎都是节点的innerHTML.

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

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

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

Ja͢*_*͢ck 42

我终于想知道它的区别,所以我挖掘了源头并找到了答案; 在大多数情况下,没有明显的区别,但是你应该注意一些边缘情况.

二者->nodeValue->textContent适用于以下类别(节点类型)相同:

以下类(节点类型)的->nodeValue属性产量NULL:

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

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

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

另见:dom_node_node_value_read()dom_node_text_content_read()

  • @pguardiario前11个类都是DOMNode的后代,问题是关于DOMNode,不知道这个问题的答案是错误的. (2认同)

mik*_*ook 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);
Run Code Online (Sandbox Code Playgroud)

输出:

string(15) "old contenttest"
NULL
string(15) "old contenttest"
string(15) "old contenttest"
Run Code Online (Sandbox Code Playgroud)

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


Ada*_*ett 5

两者textContentnodeValue返回未转义的文本;即&lt;成为<

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

如所讨论的,还有一些不支持nodeValue但支持的DOM类textContent

nodeValue由于明显的原因而更快;但是,除非您确切知道节点结构的真正含义,否则不要使用它。