簡體   English   中英

PHP DOMDocument:按類刪除元素

[英]PHP DOMDocument: Delete elements by class

我試圖刪除給定類的每個節點。

要找到我使用的元素:

$xpath = new DOMXPath($dom);
    foreach( $xpath->query('//div[contains(attribute::class, "foo")]') as $e ) {
        // Delete this node
    }

但是如何刪除這個foreach循環中的元素呢?

編輯:順便說一下:如果在DOM中有一個類“foo”的元素(在開始循環之前),我該如何檢查?

更新:

這是我的HTML:

<div class="main">
    <div class="delete_this" contenteditable="true">Target</div>
    <div class="class1"></div>
    <div class="content"><p>Anything</p></div>
</div>

這不適用於上面的示例:

$xpath = new DOMXPath($dom);
foreach( $xpath->query('//div[contains(attribute::class, "delete_this")]') as $e ) {
    $e->parentNode->removeChild($e);
}

您需要使用父元素的removeChild()方法:

$xpath = new DOMXPath($dom);
foreach($xpath->query('//div[contains(attribute::class, "foo")]') as $e ) {
    // Delete this node
    $e->parentNode->removeChild($e);
}

順便說一句,關於你的第二個問題,如果沒有找到元素,循環根本不會迭代。


這是一個工作示例:

$html = <<<EOF
<div class="main">
    <div class="delete_this" contenteditable="true">Target</div>
    <div class="class1"></div>
    <div class="content"><p>Anything</p></div>
</div>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($html);

$selector = new DOMXPath($doc);
foreach($selector->query('//div[contains(attribute::class, "delete_this")]') as $e ) {
    $e->parentNode->removeChild($e);
}

echo $doc->saveHTML($doc->documentElement);

對於問題的第二部分,查詢的結果有一個length屬性,您可以使用它來查看是否匹配了任何內容:

$xpath = new DOMXPath($doc);
$nodes = $xpath->query('//div[contains(attribute::class, "foo")]');

printf('Removing %d nodes', $nodes->length);

這將刪除該類的所有div。 要按類使用*實際刪除所有元素:

$selector = new \DOMXPath( $doc );
foreach ( $selector->query( '//*[contains(attribute::class, "' . $class . '")]' ) as $e ) {
  $e->parentNode->removeChild( $e );
}

暫無
暫無

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

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