我正在使用PHP的DOMDocument来删除与特定类名匹配的div。因此,在下面的示例中,我将删除类名为“remove-me”的任何元素。
$content = '<div class="keep-me">Keep this div</div><div class="remove-me">Remove this div</div>';
$badClasses = array('remove-me');
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($content);
$xPath = new DOMXpath($dom);
foreach($badClasses as $badClass){
$domNodeList = $nodes = $xPath->query('//*[contains(@class, "'.$badClass.'")]');
$domElemsToRemove = array();
foreach ( $domNodeList as $domElement ) {
// ...do stuff with $domElement...
$domElemsToRemove[] = $domElement;
}
foreach( $domElemsToRemove as $domElement ){
$domElement->parentNode->removeChild($domElement);
}
}
$content = $dom->saveHTML();
有什么方法可以保留所有被删除的元素,将它们转换为HTML字符串,以便我可以在页面的其他地方回显html?
答案 0 :(得分:1)
是的,你仍然可以保留那些删除的标记。在删除之前,首先将它们放在字符串容器中。你实际上并不需要两个foreach循环。一个就足够了:
$content = '<div class="keep-me">Keep this div</div><div class="remove-me">Remove this div</div>';
$badClasses = array('remove-me');
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($content);
libxml_clear_errors();
$xPath = new DOMXpath($dom);
foreach($badClasses as $badClass){
$domNodeList = $xPath->query('//*[contains(@class, "'.$badClass.'")]');
$domElemsToRemove = ''; // container of deleted elements
foreach ( $domNodeList as $domElement ) {
$domElemsToRemove .= $dom->saveHTML($domElement); // concat them
$domElement->parentNode->removeChild($domElement); // then remove
}
}
$content = $dom->saveHTML();
echo 'html removed <br/>';
echo htmlentities($domElemsToRemove);