2016-08-17 38 views
1

我有這個網站在我的數據庫:如何刪除特定的DOM元素與PHP的DOMDocument

<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><body>標記添加到我的html,我不希望這樣。我沒有看到任何關閉此選項的選項。那裏有幫助嗎?

在此先感謝,我堅持了幾個小時。

回答

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(); 
+0

由於某種原因,您的代碼會保留第二張和第三張圖片。我找到了一種使它工作的方法。在for循環中,我創建要刪除的圖像數組。然後在其他foreach循環中,我會遍歷該數組並刪除圖像。 – offline

+0

是的,第二個圖像將保持在代碼之上,但不是第三。所以你需要確保2沒有被添加到這個數組中。 '$ remainingImages = array(1);' –

+0

它不按預期工作。看看這裏:http://phpfiddle.org/main/code/rkim-st8w,運行代碼。 – offline

1

有選項,以避免增加html和body標籤時要加載HTML文件或內容:

$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