如何使用PHP DOMDocument删除特定的dom元素

时间:2016-08-17 14:14:29

标签: php html domdocument

我的数据库中有这个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>标记,我不希望这样。我没有看到任何关闭它的选项。那里也有帮助吗?

在此先感谢,我已经坚持了几个小时。

2 个答案:

答案 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');

一些答案​​接近你在这个答案中使用的问题答案:

  1. 要删除元素(您已使用过): https://stackoverflow.com/a/15272752/3086860
  2. 为避免添加额外标签:https://stackoverflow.com/a/22490902/3086860