Quelle fonction utilisez-vous pour obtenir innerHTML d'un DOMNode donné dans l'implémentation DOM de PHP ? Quelqu'un peut-il donner une solution fiable ?
Bien sûr, outerHTML fera aussi l'affaire.
Quelle fonction utilisez-vous pour obtenir innerHTML d'un DOMNode donné dans l'implémentation DOM de PHP ? Quelqu'un peut-il donner une solution fiable ?
Bien sûr, outerHTML fera aussi l'affaire.
Comparez cette variante actualisée avec Note d'utilisation du manuel PHP #89718 :
<?php
function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child)
{
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}
?>
Ejemplo:
<?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);
}
?>
Merci. Cela fonctionne bien. $dom->preserveWhiteSpace = false ; ne devrait-il pas être avant le chargement du document ?
Notes supplémentaires : Depuis PHP 5.3.6, vous pouvez épargner l'option temporaire DOMDocument
. On pourrait également remplacer le trim
avec un ltrim
(ou même le supprimer complètement) pour préserver un peu d'espace comme les sauts de ligne.
Pour retourner le html
d'un élément, vous pouvez utiliser C14N() :
$dom = new DOMDocument();
$dom->loadHtml($html);
$x = new DOMXpath($dom);
foreach($x->query('//table') as $table){
echo $table->C14N();
}
Une version simplifiée de la réponse de Haim Evgi :
<?php
function innerHTML(\DOMElement $element)
{
$doc = $element->ownerDocument;
$html = '';
foreach ($element->childNodes as $node) {
$html .= $doc->saveHTML($node);
}
return $html;
}
Exemple d'utilisation :
<?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>
*/
Il n'y a pas besoin de mettre preserveWhiteSpace
o formatOutput
.
En plus de la belle version de trincot avec array_map
y implode
mais cette fois avec array_reduce
:
return array_reduce(
iterator_to_array($node->childNodes),
function ($carry, \DOMNode $child) {
return $carry.$child->ownerDocument->saveHTML($child);
}
);
Je ne comprends toujours pas, pourquoi il n'y a pas de reduce()
qui accepte aussi bien les tableaux que les itérateurs.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.