如何使用preg_replace删除整个div

Mar*_*ski 0 html php html-parsing

好吧,因为它是WordPress问题而且遗憾的是,我需要删除父div及其内部的每个表示:

<div class="sometestclass">
   <img ....>
   <div>.....</div>
   any other html tags
</div><!-- END: .sometestclass -->
Run Code Online (Sandbox Code Playgroud)

我唯一的想法是匹配以下开头的所有内容:

<div class="sometestclass">
Run Code Online (Sandbox Code Playgroud)

并结束于:

<!-- END: .sometestclass -->
Run Code Online (Sandbox Code Playgroud)

所有这一切之间(我可以标记我想要的父div的结尾,这只是一个样本).任何人都知道如何做到这一点:

<?php $content = preg_replace('?????','',$content); ?>
Run Code Online (Sandbox Code Playgroud)

Sam*_*son 9

我不会使用正则表达式.相反,我会使用DOMDocument类.只需找到div该类的所有元素,并从父类中删除它们:

$html = "<p>Hello World</p>
         <div class='sometestclass'>
           <img src='foo.png'/>
           <div>Bar</div>
         </div>";

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

$xpath = new DOMXPath( $dom );
$pDivs = $xpath->query(".//div[@class='sometestclass']");

foreach ( $pDivs as $div ) {
  $div->parentNode->removeChild( $div );
}

echo preg_replace( "/.*<body>(.*)<\/body>.*/s", "$1", $dom->saveHTML() );
Run Code Online (Sandbox Code Playgroud)

结果如下:

<p>Hello World</p>
Run Code Online (Sandbox Code Playgroud)


Bla*_*ake 6

<?php $content = preg_replace('/<div class="sometestclass">.*?<\/div><!-- END: .sometestclass -->/s','',$content); ?>
Run Code Online (Sandbox Code Playgroud)

我的RegEx有点生疏,但我认为这应该有效.请注意,正如其他人所说,RegEx没有适当的装备来处理HTML的一些复杂性.

此外,此模式不会div在类中找到嵌入的元素sometestclass.你需要递归.