Удалить элемент HTML, сохраняя его содержимое - PullRequest
3 голосов
/ 16 мая 2019

У меня есть этот HTML:

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

И я пытаюсь использовать PHP DomDocument, чтобы преобразовать его в это:

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

Это мой код:

$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);

Но вывод таков:

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

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Вы звоните $imgvalues->parentNode->replaceChild(), который говорит, чтобы заменить ребенка родителя;таким образом, вы просто заменяете ребенка и не касаетесь родителя.

Вместо этого вы хотите иметь дело с родителем родителя.«Но в моем HTML нет ни одного», - говорите вы.Однако при работе с HTML всегда подразумевается корневой элемент, поэтому это работает:

<?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();

Вывод:

<figure><img alt="" height="400" src="img.jpg" width="800"></figure>
0 голосов
/ 16 мая 2019

Вы можете просто удалить его перед передачей $data в цикл, используя preg_replace, или вы можете сделать то же самое после цикла, в зависимости от того, что вам больше нравится:

$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);

выход

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