2010-01-18 9 views
72

Welche Funktion verwenden Sie, um innerHTML eines bestimmten DOMNode in der PHP DOM-Implementierung zu erhalten? Kann jemand eine zuverlässige Lösung geben?Wie bekomme ich innerHTML von DOMNode?

Natürlich wird OuterHTML auch tun.

Antwort

118

Compare diese aktualisierte Variante mit PHP Manual User Note #89718:

<?php 
function DOMinnerHTML(DOMNode $element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 

    foreach ($children as $child) 
    { 
     $innerHTML .= $element->ownerDocument->saveHTML($child); 
    } 

    return $innerHTML; 
} 
?> 

Beispiel:

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

Danke. Es funktioniert gut. Sollte nicht $ dom-> preserveWhiteSpace = false; bevor das Dokument geladen wird? – JohnM2

+0

@ JohnM2: [Ja sollte es] (http://stackoverflow.com/questions/798967/php-simplexml-how-to-save-the-file-in-a-formatted-way). – hakre

+0

Zusätzliche Hinweise: Seit PHP 5.3.6 können Sie das temporäre 'DOMDocument' ersparen. Man könnte auch das "trim" durch ein "ltrim" ersetzen (oder es sogar vollständig entfernen), um ein wenig Leerraum wie Zeilenumbrüche zu erhalten. – hakre

3
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); 
    } 
} 
6

Um die html eines Elements zurückkehren, können Sie C14N() verwenden:

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
$x = new DOMXpath($dom); 
foreach($x->query('//table') as $table){ 
    echo $table->C14N(); 
} 
+2

C14N wird versuchen, das HTML in ein gültiges XML zu konvertieren. Zum Beispiel
wird

ajaybc

+0

Es ist eine schmutzige Art und Weise der Dump den HTML-Code des Elements, ohne saveHTML verwenden, die HTML-, Kopf-und Body-Tags ausgeben wird. –

3

Eine vereinfachte Version von Haim Evgi Antwort:

<?php 

function innerHTML(\DOMElement $element) 
{ 
    $doc = $element->ownerDocument; 

    $html = ''; 

    foreach ($element->childNodes as $node) { 
     $html .= $doc->saveHTML($node); 
    } 

    return $html; 
} 

Beispiel Nutzung:

<?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> 
*/ 

Es gibt keine Notwendigkeit preserveWhiteSpace oder formatOutput einzustellen. Hier

14

ist eine Version in einem funktionale Programmierung Stil:

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

Neben Trincot der schönen Version mit array_map und implode aber diesmal mit array_reduce:

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

Noch nicht verstehen, warum gibt es keine reduce() Methode, die Arrays und Iteratoren gleichermaßen akzeptiert.