Как получить html внутри $node, а не только $nodeValue
Описание текущей ситуации:
У меня есть папка, полная страниц (папка-папка), каждая страница внутри этой папки имеет (помимо прочего) div с id="short-info"
.
У меня есть код, который вытаскивает все <div id="short-info">...</div>
из этой папки и отображает текст внутри него с помощью textContent
(который для этой цели такой же, как nodeValue
)
Код, который загружает divs:
<?php
$filename = glob("pages-folder/*.php");
sort($filename);
foreach ($filename as $filenamein) {
$doc = new DOMDocument();
$doc->loadHTMLFile($filenamein);
$xpath = new DOMXpath($doc);
$elements = $xpath->query("*//div[@id='short-info']");
foreach ($elements as $element) {
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->textContent;
}
}
}
?>
Теперь проблема заключается в том, что если страница, которую я загружаю, имеет дочерний элемент, например изображение: <div id="short-info"> <img src="picture.jpg"> Hello world </div>
, вывод будет только Hello world, а не изображение, а затем Hello мир.
Вопрос:
Как сделать код отображающим полный html внутри div id = "short-info", включая, например, этот образ, а не только текст?
Ответы
Ответ 1
Вы должны сделать недокументированный вызов на node.
$node->c14n()
Дает вам HTML-код, содержащийся в $node
.
Сумасшедшая правда? Я потерял волосы над этим.
http://php.net/manual/en/class.domnode.php#88441
Update
Это изменит html, чтобы соответствовать строгому HTML. Лучше использовать
$html = $Node->ownerDocument->saveHTML( $Node );
Вместо.
Ответ 2
Вы хотите, чтобы сумма составляла 'innerHTML', которую PHP dom не поддерживает напрямую. Один из них - здесь в документах PHP.
Другой вариант - взять найденный $node
, вставить его как элемент верхнего уровня нового документа DOM, а затем вызвать saveHTML()
в этом новом документе.