Les objets PHP DOMnode contiennent les attributs textContent et nodeValue qui semblent tous deux être le HHTML interne du nœud.
nodeValue: la valeur de ce nœud, selon son type
textContent: cet attribut renvoie le contenu textuel de ce nœud et de ses descendants.
Quelle est la différence entre ces deux propriétés? Quand est-il approprié d'utiliser l'un au lieu de l'autre?
Je voulais enfin connaître la différence aussi, alors j'ai creusé dans le source et trouvé la réponse; dans la plupart des cas, il n'y aura pas de différence perceptible, mais il y a un tas de cas Edge que vous devez connaître.
->nodeValue
Et ->textContent
Sont identiques pour les classes suivantes (types de nœuds):
La propriété ->nodeValue
Donne NULL
pour les classes suivantes (types de nœuds):
La propriété ->textContent
Est inexistante pour les classes suivantes:
DOMNameSpaceNode
(non documenté, mais peut être trouvé avec le sélecteur //namespace:*
)La propriété ->nodeValue
Est inexistante pour les classes suivantes:
Voir aussi: dom_node_node_value_read()
et dom_node_text_content_read()
J'espère que cela aura du sens:
$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);
Production:
string(15) "old contenttest"
NULL
string(15) "old contenttest"
string(15) "old contenttest"
textContent
et nodeValue
renvoient du texte non échappé; c'est à dire. <
devient <
.
textContent
concatène ensemble tout le contenu de tous les enfants. Cette distinction est importante; par exemple, dans Chrome la longueur maximale de nodeValue
est de 65536 caractères (pas d'octets); si vous avez déjà défini le contenu d'un nœud sur quelque chose de plus long que celui dont vous aurez besoin pour itérer les nœuds enfants si vous souhaitez utiliser nodeValue
tandis que textContent
effectuera la concaténation pour vous.
Comme indiqué, il existe également plusieurs classes DOM qui ne prennent pas en charge nodeValue
mais prennent en charge textContent
.
nodeValue
est plus rapide pour des raisons évidentes; cependant, ne l'utilisez que si vous savez exactement quelle est la structure du nœud.
Si vous souhaitez affecter une valeur à la propriété textContent
, notez que cela ne fonctionne pas pour PHP <5.6.1 . Pensez à utiliser nodeValue
à la place, pour des raisons de compatibilité descendante.