Вы должны посетить все узлы и вернуть их текст. Если некоторые содержат другой узел, посетите их тоже.
Это можно сделать с помощью этого базового рекурсивного алгоритма:
extractNode:
if node is a text node or a cdata node, return its text
if is an element node or a document node or a document fragment node:
if it’s a script node, return an empty string
return a concatenation of the result of calling extractNode on all the child nodes
for everything else return nothing
Реализация:
function extractText($node) {
if (XML_TEXT_NODE === $node->nodeType || XML_CDATA_SECTION_NODE === $node->nodeType) {
return $node->nodeValue;
} else if (XML_ELEMENT_NODE === $node->nodeType || XML_DOCUMENT_NODE === $node->nodeType || XML_DOCUMENT_FRAG_NODE === $node->nodeType) {
if ('script' === $node->nodeName) return '';
$text = '';
foreach($node->childNodes as $childNode) {
$text .= extractText($childNode);
}
return $text;
}
}
Это вернет textContent данного $ узла, игнорируя теги скрипта и комментарии.
$words = htmlspecialchars(extractText($bodyNodes->item(0)));
Попробуйте здесь: http://codepad.org/CS3nMp7U