[英]Simple HTML Dom: How to remove elements?
我想使用簡單的 HTML DOM 來刪除文章中的所有圖像,這樣我就可以輕松地為新聞代碼創建一小段文本,但我還沒有弄清楚如何使用它來刪除元素。
基本上我會做
有什么幫助嗎?
沒有用於刪除元素的專用方法。 您只需找到所有 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.