2 votes

Supprimer un élément HTML tout en conservant son contenu

J'ai ce HTML :

<p><img alt="" height="400" src="img.jpg" width="800" /></p> 

J'essaie d'utiliser PHP DomDocument pour le transformer en ceci :

<figure><img src="img.jpg"></figure>

Voici mon code :

$data='<p><img alt="" height="400" src="img.jpg" width="800" /></p>';
$doc = new DOMDocument();
$doc->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
$imgtags = $doc->getElementsByTagName('img');
foreach ($imgtags as $key => $imgvalues){
    $parent = $imgvalues->parentNode;
    $imgsrc = $imgvalues->getAttribute('src');
    $newimg = $doc->createElement('img');
    $newimg->setAttribute('src', $imgsrc);
    $figure = $doc->createElement('figure');
    $figure->appendChild($newimg);
    $imgvalues->parentNode->replaceChild($figure, $imgvalues);
}
$body1 = $doc->saveHTML($doc->documentElement);

Mais le résultat est le suivant :

<p><figure><img src="img.jpg"></figure></p>

0voto

Emma Points 1

Vous pouvez simplement le supprimer avant de passer votre $data à la boucle en utilisant un preg_replace ou vous pouvez faire la même chose après votre boucle, selon ce que vous préférez :

$data = '<p><img alt="" height="400" src="img.jpg" width="800" /></p>';
$data = preg_replace('/<p>(.*)<\/p>/s', '$1', $data);

$doc = new DOMDocument();
$doc->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($doc);
$imgtags = $doc->getElementsByTagName('img');
foreach ($imgtags as $key => $imgvalues) {
    $parent = $imgvalues->parentNode;
    $imgsrc = $imgvalues->getAttribute('src');
    $newimg = $doc->createElement('img');
    $newimg->setAttribute('src', $imgsrc);
    $figure = $doc->createElement('figure');
    $figure->appendChild($newimg);
    $imgvalues->parentNode->replaceChild($figure, $imgvalues);
}
$body1 = $doc->saveHTML($doc->documentElement);

var_dump($body1);

Sortie

 string(36) "<figure><img src="img.jpg"></figure>"

0voto

miken32 Points 8438

Vous appelez $imgvalues->parentNode->replaceChild() qui dit de remplacer l'enfant du parent ; donc vous remplacez juste l'enfant et ne touchez pas le parent.

Ce que vous voulez faire à la place, c'est traiter avec le parent du parent. "Mais il n'y en a pas dans mon HTML", dites-vous. Cependant, il y a toujours un élément Root implicite lorsque vous traitez avec du HTML, donc cela fonctionne :

<?php
$html = '<p><img alt="" height="400" src="img.jpg" width="800" /></p>';
$dom = new DomDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$images = $dom->getElementsByTagName("img");
foreach ($images as $img) {
    $img_copy = $img->cloneNode(true);
    $p = $img->parentNode;
    $fig = $dom->createElement("figure");
    $fig->appendChild($img_copy);
    $p->parentNode->replaceChild($fig, $p);
}
echo $dom->saveHTML();

Sortie :

<figure><img alt="" height="400" src="img.jpg" width="800"></figure>

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