Php 删除HTML元素,同时保留其内容
我有这个HTML:Php 删除HTML元素,同时保留其内容,php,html,dom,domdocument,Php,Html,Dom,Domdocument,我有这个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=
<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);
$data='';
$doc=新的DOMDocument();
$doc->loadHTML($data,LIBXML\u HTML\u noimpled | LIBXML\u HTML\u NODEFDTD);
$xpath=新的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);
$imgValue->parentNode->replaceChild($figure,$imgValue);
}
$body1=$doc->saveHTML($doc->documentElement);
但结果是:
<p><figure><img src="img.jpg"></figure></p>
在使用preg\u replace
将$data
传递到循环之前,您可以简单地将其删除,也可以在循环后执行相同的操作,以您更喜欢的操作为准:
$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);
$data='';
$data=preg_replace('/(.*)/s','$1',$data);
$doc=新的DOMDocument();
$doc->loadHTML($data,LIBXML\u HTML\u noimpled | LIBXML\u HTML\u NODEFDTD);
$xpath=新的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);
$imgValue->parentNode->replaceChild($figure,$imgValue);
}
$body1=$doc->saveHTML($doc->documentElement);
var_dump(1美元);
输出
string(36)”
调用$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();
您好,是的,我想使用preg_replace,但有时有类或样式属性,preg_replace必须更改,因此我想使用php DOM。您也应该使用DOM来更改原始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>