PHP DOM textContent vs nodeValue?
Posted
技术标签:
【中文标题】PHP DOM textContent vs nodeValue?【英文标题】:PHP DOM textContent vs nodeValue? 【发布时间】:2012-09-05 01:04:55 【问题描述】:php DOMnode 对象包含一个textContent 和nodeValue 属性,它们似乎都是节点的innerhtml。
nodeValue:这个节点的值,取决于它的类型
textContent:该属性返回该节点及其后代的文本内容。
这两个属性有什么区别?什么时候用一个代替另一个合适?
【问题讨论】:
【参考方案1】:希望这是有道理的:
$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
【讨论】:
DOMDocument 的 nodeValue 为 NULL 那么?【参考方案2】:它们是一样的。 (mikespook 的 NULL 来自非 DOMNode)
【讨论】:
不,DOMDocument 是 DOMNode 的后代;属性 getter 的实现只是将值定义为 NULL。 嗯?问题是关于 DOMNode,而不是 DOMDocument。 是的,嗯,DOMDocument 也是一个 DOMNode 不是吗?我专门指的是关于迈克的回答的评论。【参考方案3】:我终于也想知道其中的区别,于是我挖了source,找到了答案;在大多数情况下,不会有明显的区别,但是您应该注意一些边缘情况。
->nodeValue
和 ->textContent
对于以下类(节点类型)是相同的:
DOMAttr
DOMText
DOMElement
DOMComment
DOMCharacterData
DOMProcessingInstruction
->nodeValue
属性为以下类(节点类型)生成 NULL
:
DOMDocumentFragment
DOMDocument
DOMNotation
DOMEntity
DOMEntityReference
->textContent
属性对于以下类不存在:
DOMNameSpaceNode
(未记录,但可以通过 //namespace:*
选择器找到)
->nodeValue
属性对于以下类不存在:
DOMDocumentType
另请参阅:dom_node_node_value_read()
和 dom_node_text_content_read()
【讨论】:
【参考方案4】:如果您想为textContent
属性分配一个值,请注意它不适用于PHP < 5.6.1。考虑改用nodeValue
,以实现向后兼容性。
【讨论】:
【参考方案5】:textContent
和 nodeValue
都返回未转义的文本;即&lt;
变为<
。
textContent
将所有子项的所有内容连接在一起。这是一个重要的区别;例如,在 Chrome 中,nodeValue
的最大长度是 65536 个字符(不是字节);如果您已经将节点的内容设置为比此更长的内容,如果您想使用 nodeValue
,则需要迭代子节点,而 textContent
将为您执行连接。
如上所述,还有几个 DOM 类不支持nodeValue
,但支持textContent
。
nodeValue
更快,原因很明显;但是,除非您确切知道节点结构的真正含义,否则不要使用它。
【讨论】:
以上是关于PHP DOM textContent vs nodeValue?的主要内容,如果未能解决你的问题,请参考以下文章
html JS.DOM.AddingElements.textContent.CreateElement.Append
html JS.DOM.ContentHtml.textContent.innerHTML.ChangingAttr
html JS.DOM.ContentHtml.ModDOMnodes.textContent.innerHTML
JavaScript 学习-33.HTML DOM 获取和修改文本节点( textContent,innerText 和 innerHTML)
innerText vs innerHTML vs label vs text vs textContent vs outerText