【问题标题】:How to remove specific dom element with PHP DOMDocument如何使用 PHP DOMDocument 删除特定的 dom 元素
【发布时间】:2016-08-17 14:14:29
【问题描述】:

我的数据库中有这个 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\">

有条件地,我需要删除一些特定的&lt;img&gt; 标签。所以我不想删除所有&lt;img&gt; 标签,而只删除特定的标签。

我已经尝试过了,但它会删除所有&lt;img&gt; 标签,即使我不想这样做:

$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() 方法正在将&lt;html&gt;&lt;body&gt; 标记添加到我的html 中,我不希望这样。我没有看到任何关闭此功能的选项。那里也有帮助吗?

提前谢谢,我已经坚持了好几个小时了。

【问题讨论】:

    标签: php html domdocument


    【解决方案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();
    

    【讨论】:

    • 您的代码将出于某种原因保留第二张和第三张图片。我找到了一种让它工作的方法。在 for 循环中,我创建要删除的图像数组。然后在额外的 foreach 循环中,我遍历该数组并删除图像。
    • 是的,第二个图像将保留在代码上方,而不是第三个。所以你需要确保 2 没有添加到这个数组中。 $remainImages = array(1);
    • 它没有按预期工作。看这里:phpfiddle.org/main/code/rkim-st8w,运行代码。
    • 我在我的代码中发现了问题,如果您想保留下面的第二张图像,请将 2 传递到数组中。 $remainImages = array(2); 所以如果你想保留 8 和 14 那么请$remainImages = array(8,14);
    【解决方案2】:

    当您想要加载 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多