105 votes

Comment obtenir innerHTML de DOMNode ?

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.

165voto

Haim Evgi Points 40786

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); 
} 
?>

1 votes

Merci. Cela fonctionne bien. $dom->preserveWhiteSpace = false ; ne devrait-il pas être avant le chargement du document ?

1 votes

@JohnM2 : Oui, il devrait .

1 votes

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.

31voto

trincot Points 10112

Voici une version dans un programmation fonctionnelle le style :

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

15voto

Pedro Lobito Points 6794

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();
}

10voto

Alf Eaton Points 1209

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 .

4voto

flu Points 3120

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.com

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.

Powered by:

X