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.
Voici une autre approche basée sur ce commentaire par Drupella sur php.net, qui a bien fonctionné pour mon projet. Il définit le innerHTML()
en créant un nouveau DOMDocument
en important et en ajoutant le nœud cible, au lieu d'itérer explicitement sur les nœuds enfants.
Définissons cette fonction d'aide :
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 );
}
où nous pouvons inclure/exclure la balise cible extérieure par le biais du deuxième argument d'entrée.
Ici, nous extrayons le HTML interne pour une balise cible donnée par l'attribut id "first" :
$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>
}
Exemple concret :
http://sandbox.onlinephpfunctions.com/code/2714ea116aad9957c3c437d46134a1688e9133b8
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);
}
}
Vieille requête, mais il existe une méthode intégrée pour le faire. Il suffit de passer le nœud cible à DomDocument->saveHtml()
.
Exemple complet :
$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);
Sortie : <p>ciao questa è una <b>prova</b>.</p>
Pour les personnes qui veulent obtenir le HTML à partir d'une requête XPath, voici ma version :
$xpath = new DOMXpath( $my_dom_object );
$DOMNodeList = $xpath->query('//div[contains(@class, "some_custom_class_in_html")]');
if( $DOMNodeList->count() > 0 ) {
$page_html = $my_dom_object->saveHTML( $DOMNodeList->item(0) );
}
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.