我有这个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>
答案 0 :(得分:1)
您致电$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>
答案 1 :(得分:0)
您可以在使用$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>"