preg replace 从字符串中删除 div

preg replace to remove a div from a string

我正在尝试从字符串中删除 HTML 元素,

我有以下 preg_replace ;

    $body = preg_replace('#<div class="code-block code-block-12" style="margin: 8px 0; clear: both;">(.*?)</div>#', '', $body);

但是preg_replace好像不行;

这是完整的代码;

    $html = new DOMDocument();
     @$html->loadHtmlFile($url);
     $xpath = new DOMXPath( $html );
     $nodelist = $xpath->query( '//*[@class="coincodex-content"]' );
     $body = '';
    foreach ($nodelist as $n){
        $body .= $html->saveHtml($n)."\n";
    } 
    
    $body = preg_replace('#<div class="code-block code-block-12" style="margin: 8px 0; clear: both;">(.*?)</div>#', '', $body);
    

当前输出是这样的;

<div class="coincodex-content">
hello this is content
<div class="code-block code-block-12" style="margin: 8px 0; clear: both;">
<div><center><span style="font-size:11px; color: gray;"TEST</span></center>
<b>TEST</b><br><br></div></div>
<div class="rp4wp-related-posts rp4wp-related-post">
    </ul></div><!-- AI CONTENT END 1 -->
<div class="entry-tags" style="margin-bottom:15px; font-weight: bold; text-align:center;">Tags: <a href="#" rel="tag">test</a> <a href="#" rel="tag">#tag</a></div>
</div>

我想要的输出是;

<div class="coincodex-content">
hello this is content
</div>

非常感谢任何帮助我确信有更简单的方法可以实现这一点我只是不完全确定为什么我当前的方法不起作用谢谢。

这有点作弊。尝试使用正则表达式解析 HTML 的主要问题是嵌套标签,这会让您抓狂。如果您真的只需要保留第一个 <div> 和第二个 <div> 之前出现的内容,下面的方法就可以了。

preg_match('#<div class="coincodex-content">(.*)<div.*$#Us', $body, $matches);
$body = '<div class="coincodex-content">' . $matches[1] . '</div>';

...因为我们只是提取我​​们需要的内容,并将其插入到静态的内容格式中。

犯规

正则表达式不适合修改 DOM 元素。你的实验表明了这一点。结果是错误的,也是无效的HTML.

您可以更好地使用DOM方法来解决评论中提到的问题。 DOM 有一个方法 DOMNode::removeChild 可以用来删除元素。 为了展示如何使用 removeChild,我选择了更简单的 HTML.

$html = <<<HTML
<div>
<div class="coincodex-content">
hello this is content
  <div class="delete_this" style="margin: 8px 0; clear: both;">
    <div>
       <center><span style="font-size:11px; color: gray;">TEST</span></center>
       <b>TEST</b><br><br>
     </div>
  </div>
  <div class="preserved">
    Test2
  </div>
</div>
</div>
HTML;

我将碎片收集到一个数组中。

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query( '//*[@class="coincodex-content"]' );

$fragment = [];
foreach($nodelist as $contentNode){
  $removeNodelist = $xpath->query('//div[@class="delete_this"]',$contentNode); 
  $item = $removeNodelist->item(0);  //only first
  $item->parentNode->removeChild($item); 
  $fragment[] = $doc->saveHTML($contentNode); 
}

片段[0]中的结果:

<div class="coincodex-content">
hello this is content
  
  <div class="preserved">
    Test2
  </div>
</div>

3v4l.org 亲自尝试。