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.

3voto

birgire Points 4800

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.

InnerHTML

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.

Exemple d'utilisation

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

3voto

Chris Points 1
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);
  }
}

2voto

Marco Marsala Points 128

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>

1voto

Ellery Points 17

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