Как получить innerHTML DOMNode?

Какую функцию вы используете для получения innerHTML данного DOMNode в реализации PHP DOM? Может ли кто-нибудь дать надежное решение?

Конечно, внешнийHTML тоже будет.

Сравните этот обновленный вариант с примечанием пользователя руководства пользователя PHP # 89718 :

<?php function DOMinnerHTML(DOMNode $element) { $innerHTML = ""; $children = $element->childNodes; foreach ($children as $child) { $innerHTML .= $element->ownerDocument->saveHTML($child); } return $innerHTML; } ?> 

Пример:

 <?php $dom= new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->load($html_string); $domTables = $dom->getElementsByTagName("table"); // Iterate over DOMNodeList (Implements Traversable) foreach ($domTables as $table) { echo DOMinnerHTML($table); } ?> 

Вот версия в стиле функционального программирования :

 function innerHTML($node) { return implode(array_map([$node->ownerDocument,"saveHTML"], iterator_to_array($node->childNodes))); } 

Чтобы вернуть html элемента, вы можете использовать C14N () :

 $dom = new DOMDocument(); $dom->loadHtml($html); $x = new DOMXpath($dom); foreach($x->query('//table') as $table){ echo $table->C14N(); } 
 function setnodevalue($doc, $node, $newvalue){ while($node->childNodes->length> 0){ $node->removeChild($node->firstChild); } $fragment= $doc->createDocumentFragment(); $fragment->preserveWhiteSpace= false; if(!empty($newvalue)){ $fragment->appendXML(trim($newvalue)); $nod= $doc->importNode($fragment, true); $node->appendChild($nod); } } 

Упрощенная версия ответа Хаима Евги:

 <?php function innerHTML(\DOMElement $element) { $doc = $element->ownerDocument; $html = ''; foreach ($element->childNodes as $node) { $html .= $doc->saveHTML($node); } return $html; } 

Пример использования:

 <?php $doc = new \DOMDocument(); $doc->loadHTML("<body><div id='foo'><p>This is <b>an <i>example</i></b> paragraph<br>\n\ncontaining newlines.</p><p>This is another paragraph.</p></div></body>"); print innerHTML($doc->getElementById('foo')); /* <p>This is <b>an <i>example</i></b> paragraph<br> containing newlines.</p> <p>This is another paragraph.</p> */ 

Нет необходимости устанавливать preserveWhiteSpace или formatOutput .

В дополнение к красивой версии array_map с array_map и array_map но на этот раз с array_reduce :

 return array_reduce( iterator_to_array($node->childNodes), function ($carry, \DOMNode $child) { return $carry.$child->ownerDocument->saveHTML($child); } ); 

Все еще не понимаю, почему нет метода reduce() который принимает массивы и итераторы.