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.
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.
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);
}
?>
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);
}
}
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();
}
C14N wird versuchen, das HTML in ein gültiges XML zu konvertieren. Zum Beispiel
wird
–
ajaybc
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. –
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
ist eine Version in einem funktionale Programmierung Stil:
function innerHTML($node) {
return implode(array_map([$node->ownerDocument,"saveHTML"],
iterator_to_array($node->childNodes)));
}
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.
Danke. Es funktioniert gut. Sollte nicht $ dom-> preserveWhiteSpace = false; bevor das Dokument geladen wird? – JohnM2
@ JohnM2: [Ja sollte es] (http://stackoverflow.com/questions/798967/php-simplexml-how-to-save-the-file-in-a-formatted-way). – hakre
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