如何最好地删除插入图像周围的 <div> 标签包装器

How best to remove <div> tag wrapper around inserted images

我有以下 HTML:

<div><p><img src="https://test1.jpg" /></p></div>
<p>aaa</p>
<p>bbb</p>
<p>ccc<div>ddd <img src="http://test2.jpg" /></div></p>
<p>eee</p>
<p>fff</p>
<p>ggg</p>
<p>hhh</p>
<p>iii</p>
<div><p><img src="https://test3.jpg" /></p></div>

但我需要删除 p 标签外图像周围的 div 标签;预期输出是:

<p><img src="https://test1.jpg" /></p>
<p>aaa</p>
<p>bbb</p>
<p>ccc<div>ddd <img src="http://test2.jpg" /></div></p>
<p>eee</p>
<p>fff</p>
<p>ggg</p>
<p>hhh</p>
<p>iii</p>
<p><img src="https://test3.jpg" /></p>

有人知道如何使用 PHP preg_replace 函数吗?

您真的不想使用正则表达式来执行此操作,您应该改用 DOMDocument。虽然这看起来更长更复杂,但它更安全。

$dom = new DOMDocument();
$html = '<div><p><img src="https://test1.jpg" /></p></div>ccc<div>ddd <img src="http://test2.jpg" /></div>';
libxml_use_internal_errors(true);

$dom->loadHTML($html);

foreach($dom->getElementsByTagName( 'div' ) as $node) {
     // this bit is a little hacky, but if you can predict the values use it to exclude some items
     if(strpos($node->nodeValue, 'ddd') !== false) {
         continue;
     }

     $fragment = $dom->createDocumentFragment();
     while($node->childNodes->length > 0) {
        $fragment->appendChild($node->childNodes->item(0));
     }

     $node->parentNode->replaceChild($fragment,$node);
}

$html = $dom->saveHTML();

echo $html;

sandbox example