Подтвердить что ты не робот

PHP DOM textContent vs nodeValue?

Объекты PHP DOMnode содержат атрибуты textContent и nodeValue, которые кажутся innerHTML node.

nodeValue: значение этого node, в зависимости от его типа

textContent: этот атрибут возвращает текстовое содержимое этого node и его потомков.

В чем разница между этими двумя свойствами? Когда правильно использовать один вместо другого?

4b9b3361

Ответ 1

Наконец-то мне захотелось узнать разницу, поэтому я выкопал источник и нашел ответ; в большинстве случаев не будет заметной разницы, но есть куча крайних случаев, о которых вы должны знать.

Оба ->nodeValue и ->textContent идентичны для следующих классов (node types):

Свойство ->nodeValue дает NULL для следующих классов (node types):

Свойство ->textContent не существует для следующих классов:

  • DOMNameSpaceNode (не задокументирован, но может быть найден с помощью селектора //namespace:*)

Свойство ->nodeValue не существует для следующих классов:

Смотрите также: dom_node_node_value_read() и dom_node_text_content_read()

Ответ 2

Надеюсь, это будет иметь смысл:

$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 - значение этого node, в зависимости от его типа

Ответ 3

Оба textContent и nodeValue возвращают неэкранированный текст; т.е. &lt; становится <.

textContent объединяет все содержимое всех детей. Это важное различие; например, в Chrome максимальная длина nodeValue составляет 65536 символов (не байтов); если вы уже установили содержимое node чем-то дольше, чем вам нужно будет перебирать дочерние узлы, если вы хотите использовать nodeValue, тогда как textContent будет выполнять конкатенацию для вас.

Как обсуждалось, есть также несколько классов DOM, которые не поддерживают nodeValue, но поддерживают textContent.

nodeValue быстрее по очевидным причинам; однако не используйте его, если вы точно не знаете, что такое структура node.

Ответ 4

Если вы хотите присвоить значение значению свойства textContent, что оно не работает для PHP < 5.6.1. Вместо этого используйте nodeValue для обратной совместимости.

Ответ 5

Это одно и то же. (mikespook NULL из не-DOMNode)