2012-09-12 108 views
34

PHP DOMnode對象包含一個textContentnodeValue屬性,這兩個屬性似乎都是節點的innerHTML。PHP DOM textContent vs nodeValue?

的nodeValue:此節點的值,取決於其類型

的textContent:此屬性返回此節點及其後代的文本內容。

這兩個屬性有什麼區別?什麼時候使用一個而不使用另一個?

回答

36

我終於想知道這個差異,所以我挖入source並找到答案;在大多數情況下,不會有明顯的差異,但是您應該瞭解一堆邊緣案例。

兩個->nodeValue->textContent是相同的爲以下類別(節點類型):

->nodeValue屬性收率NULL爲以下類別(節點類型):

->textContent屬性是不存在用於以下類:

  • DOMNameSpaceNode(沒有記錄,但可以用//namespace:*選擇器中找到)

->nodeValue屬性是不存在的對於以下類別:

參見:dom_node_node_value_read()dom_node_text_content_read()

+1

這是一個很好的答案,但這是錯誤的問題。 – pguardiario

+1

@pguardiario前11個類都是DOMNode的後代,問題是關於DOMNode,不知道這個問題的錯誤答案。 –

13

希望這將使意義:

$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

+0

DOMDocument的nodeValue是NULL然後呢? – danidacar

-3

他們是同樣的事情。 (mikespook的NULL來自非DOMNode)

+0

不,DOMDocument是DOMNode的後代;屬性獲取器的實現只是將該值定義爲NULL。 –

+0

咦?問題是關於DOMNode,而不是DOMDocument。 – pguardiario

+2

是的,好吧,DOMDocument也是一個DOMNode不是嗎?我特別提到了關於邁克回答的評論。 –

0

如果你想分配一個值textContent財產注意,它不會爲PHP < 5.6.1工作。考慮使用nodeValue來代替,以實現向後兼容。

2

textContentnodeValue都返回未轉義的文本;即&lt;變成<

textContent將所有孩子的所有內容連接在一起。這是一個重要的區別;例如,在Chrome中,nodeValue的最大長度爲65536個字符(非字節);如果您已經將節點的內容設置爲比您要使用nodeValue的迭代子節點更長的內容,而textContent將爲您執行級聯。

如前所述,還有幾個DOM類不支持nodeValue,但支持textContent

nodeValue由於顯而易見的原因,速度更快;但是除非您確切知道節點結構究竟是什麼,否則不要使用它。