簡體   English   中英

簡單的 HTML Dom:如何刪除元素?

[英]Simple HTML Dom: How to remove elements?

我想使用簡單的 HTML DOM 來刪除文章中的所有圖像,這樣我就可以輕松地為新聞代碼創建一小段文本,但我還沒有弄清楚如何使用它來刪除元素。

基本上我會做

  1. 以 HTML 字符串形式獲取內容
  2. 從內容中刪除所有圖像標簽
  3. 將內容限制為 x 個單詞
  4. 輸出。

有什么幫助嗎?

沒有用於刪除元素的專用方法。 您只需找到所有 img 元素,然后執行

$e->outertext = '';

當您只刪除外部文本時,您會刪除 HTML 內容本身,但如果您對相同的元素執行另一個查找,它將出現在結果中。 原因是簡單的 HTML DOM 對象仍然具有元素的內部結構,只是沒有其實際內容。 為了真正刪除元素,您需要做的只是將 HTML 作為字符串重新加載到同一個變量。 這樣,對象將在沒有刪除內容的情況下重新創建,而簡單的 HTML DOM 對象將在沒有它的情況下構建。

這是一個示例函數:

public function removeNode($selector)
{
    foreach ($this->find($selector) as $node)
    {
        $node->outertext = '';
    }

    $this->load($this->save());        
}

把這個函數放在 simple_html_dom 類中,你就很好了。

我認為您遇到了一些困難,因為您忘記了保存(將內部 DOM 樹轉儲回字符串)。

嘗試這個:

$html = file_get_html("http://example.com");

foreach($html ->find('img') as $item) {
    $item->outertext = '';
    }

$html->save();

echo $html;

我不知道該把函數放在哪里,所以我直接在我的代碼中輸入了以下內容:

$html->load($html->save());

它基本上將 for 循環中所做的更改鎖定回上述 html 中。

假定的解決方案非常昂貴,並且在大循環或其他類型的重復中實際上無法使用。

我更喜歡使用“軟刪除”:

foreach($html->find('somecondition'),$item){
    if (somecheck) $item->setAttribute('softDelete', true); //<= set marker to check in further code
    $item->outertext='';


   foreach($foo as $bar){
       if(!baz->getAttribute('softDelete'){
           //do something 
        }
    }

}

這對我有用:

foreach($html->find('element') as $element){
   $element = NULL;
}

添加新答案,因為removeNode絕對是刪除它的更好方法:

$html->removeNode('img');

標記接受的答案時,此方法可能不可用。 您不需要循環 html 來查找每一個,這將刪除它們。

使用outerhtml代替outertext

<div id='your_div'>the contents of your div</div>

$your_div->outertext = '';
echo $your_div // echoes <div id='your_div'></div>

$your_div->outerhtml= '';
echo $your_div // echoes nothing

嘗試這個:

$dom = new Dom();
$dom->loadStr($text);
foreach ($dom->find('element') as $element) {
   $element->delete();
}

這現在有效:

$element->remove();

您可以在此處查看該方法的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM