49

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

nodeValue:这个节点的值,取决于它的类型

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

这两个属性有什么区别?什么时候用一个代替另一个合适?

4

5 回答 5

46

我终于也想知道其中的区别,所以我挖掘了源代码并找到了答案;在大多数情况下,不会有明显的区别,但是您应该注意一些边缘情况。

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

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

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

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

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

另见:dom_node_node_value_read()dom_node_text_content_read()

于 2014-07-14T05:52:20.773 回答
19

希望这是有道理的:

$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 - 这个节点的值,取决于它的类型

于 2012-09-12T05:04:31.970 回答
7

两者都textContent返回nodeValue未转义的文本;即&lt;变成<.

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

正如所讨论的,还有几个不支持nodeValue但支持的 DOM 类textContent

nodeValue由于明显的原因更快;但是,除非您确切知道节点结构到底是什么,否则不要使用它。

于 2016-12-06T17:03:57.553 回答
0

如果您想为textContent属性分配值,请注意它不适用于PHP < 5.6.1。考虑nodeValue改为使用,以实现向后兼容性。

于 2016-10-02T08:53:15.160 回答
-4

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

于 2014-02-17T01:37:16.437 回答