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

时间:2016-04-13 08:19:07

标签: php dom preg-replace

我有以下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>

但我需要删除div标记之外的图片周围的p标记;预期的产出是:

<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函数吗?

1 个答案:

答案 0 :(得分:1)

你真的不想用正则表达式来做这件事,你应该使用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