我的数据库中有这个html:
<p>some text 1</p>
<img src=\"http://www.example.com/images/some_image_1.jpg\">
<p>some text 2</p>
<p>some text 3</p>
<img src=\"http://www.example.com/images/some_image_2.jpg\">
<p>some text 4</p>
<p>some text 5</p>
<img src=\"http://www.example.com/images/some_image_3.jpg\">
有条件地,我需要删除一些特定的<img>
标记。因此,我不想删除所有<img>
标记,只删除特定标记。
我试过这个,但它会删除所有<img>
代码,即使我不想这样:
$dom = new \DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($html);
$nodes = $dom->getElementsByTagName("img");
for($i = 0; $i < $nodes->length; $i++) {
if ($i == 1) {
continue;
}
$image = $nodes->item($i);
$image->parentNode->removeChild($image);
}
return $dom->saveHTML();
有人可以帮我吗?在这个html示例中,让我们说我要删除文本中的第一个和第三个图像,但要留下第二个。
另外,我注意到saveHTML()
方法正在向我的html添加<html><body>
标记,我不希望这样。我没有看到任何关闭它的选项。那里也有帮助吗?
在此先感谢,我已经坚持了几个小时。
答案 0 :(得分:1)
您可以使用数组执行此操作。我修改了你的代码,这不会删除第二个img标签。
$dom = new \DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadHTML($html);
// Declare array with numeric vlaues
$remainImages = array(1);
$nodes = $dom->getElementsByTagName("img");
for($i = 0; $i < $nodes->length; $i++) {
if (!in_array($i,$remainImages) {
$image = $nodes->item($i);
$image->parentNode->removeChild($image);
}
}
return $dom->saveHTML();
答案 1 :(得分:1)
当您要加载html文件或内容时,可以选择避免添加html和body标记:
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
@$dom->loadHTML(file_get_contents('file.html'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
//@$dom->loadHTMLFile('file.html'); //Adds Html and body tags if not exist at the beginning
$nodes = $dom->getElementsByTagName("img");
foreach($nodes as $i => $node){
if ($i == 1) {
continue;
}
$image = $nodes->item($i);
$image->parentNode->removeChild($image);
}
return $dom->saveHTML();
//$dom->saveHtmlFile('file.html');
一些答案接近你在这个答案中使用的问题答案: