PHP - xPath DOM 元素到 HTML 字符串


PHP - xPath DOM element to HTML string

我正在使用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?

是的,您仍然可以保留那些已删除的标记。在删除之前,请先将它们放入字符串容器中。您实际上不需要两个 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);