Welche Funktion verwenden Sie, um innerHTML eines bestimmten DOMNode in der PHP-DOM-Implementierung abzurufen? Kann jemand eine zuverlässige Lösung geben?
Natürlich reicht OuterHTML auch.
Welche Funktion verwenden Sie, um innerHTML eines bestimmten DOMNode in der PHP-DOM-Implementierung abzurufen? Kann jemand eine zuverlässige Lösung geben?
Natürlich reicht OuterHTML auch.
Antworten:
Vergleichen Sie diese aktualisierte Variante mit dem 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);
}
?>
DOMDocument
. Möglicherweise möchten Sie auch das trim
durch ein ersetzen ltrim
(oder es sogar vollständig entfernen), um ein wenig Leerzeichen wie Zeilenumbrüche zu erhalten.
DOMElement
anstelle von a zu erwarten, DOMNode
da ich die Rückgabe von übergeben habe DOMDocument::getElementById()
. Nur für den Fall, dass es jemand anderen auslöst.
Um das html
eines Elements zurückzugeben, können Sie C14N () verwenden :
$dom = new DOMDocument();
$dom->loadHtml($html);
$x = new DOMXpath($dom);
foreach($x->query('//table') as $table){
echo $table->C14N();
}
Eine vereinfachte Version von Haim Evgis Antwort:
<?php
function innerHTML(\DOMElement $element)
{
$doc = $element->ownerDocument;
$html = '';
foreach ($element->childNodes as $node) {
$html .= $doc->saveHTML($node);
}
return $html;
}
Anwendungsbeispiel:
<?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 besteht keine Notwendigkeit zu setzen preserveWhiteSpace
oder formatOutput
.
Zusätzlich zu Trincots netter Version mit array_map
und implode
diesmal aber mit array_reduce
:
return array_reduce(
iterator_to_array($node->childNodes),
function ($carry, \DOMNode $child) {
return $carry.$child->ownerDocument->saveHTML($child);
}
);
Ich verstehe immer noch nicht, warum es keine reduce()
Methode gibt, die Arrays und Iteratoren gleichermaßen akzeptiert.
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);
}
}
Hier ist ein weiterer Ansatz, der auf diesem Kommentar von Drupella auf php.net basiert und für mein Projekt gut funktioniert hat. Es definiert das, innerHTML()
indem ein neuer DOMDocument
Zielknoten erstellt, importiert und an diesen angehängt wird, anstatt explizit über untergeordnete Knoten zu iterieren.
Definieren wir diese Hilfsfunktion:
function innerHTML( \DOMNode $n, $include_target_tag = true ) {
$doc = new \DOMDocument();
$doc->appendChild( $doc->importNode( $n, true ) );
$html = trim( $doc->saveHTML() );
if ( $include_target_tag ) {
return $html;
}
return preg_replace( '@^<' . $n->nodeName .'[^>]*>|</'. $n->nodeName .'>$@', '', $html );
}
Hier können wir das äußere Ziel-Tag über das zweite Eingabeargument ein- / ausschließen.
Hier extrahieren wir den inneren HTML-Code für ein Ziel-Tag, das durch das "erste" ID-Attribut angegeben wird:
$html = '<div id="first"><h1>Hello</h1></div><div id="second"><p>World!</p></div>';
$doc = new \DOMDocument();
$doc->loadHTML( $html );
$node = $doc->getElementById( 'first' );
if ( $node instanceof \DOMNode ) {
echo innerHTML( $node, true );
// Output: <div id="first"><h1>Hello</h1></div>
echo innerHTML( $node, false );
// Output: <h1>Hello</h1>
}
Live-Beispiel:
http://sandbox.onlinephpfunctions.com/code/2714ea116aad9957c3c437d46134a1688e9133b8
Alte Abfrage, aber es gibt eine eingebaute Methode, um das zu tun. Übergeben Sie einfach den Zielknoten an DomDocument->saveHtml()
.
Vollständiges Beispiel:
$html = '<div><p>ciao questa è una <b>prova</b>.</p></div>';
$dom = new DomDocument($html);
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->query('.//div/*'); // with * you get inner html without surrounding div tag; without * you get inner html with surrounding div tag
$innerHtml = $dom->saveHtml($node);
var_dump($innerHtml);
Ausgabe: <p>ciao questa è una <b>prova</b>.</p>