建议使用正则表达式解决方案
PHP RegEx remove empty paragraph tags
#<p>(\s| |</?\s?br\s?/?>)*</?p>#
我的example-string失败:
<p><br></p><div align="justify"><b>Some Text</b></div><p></p>
我无法弄明白为什么。
在这里查看Live Regex
http://www.phpliveregex.com/p/6ID
答案 0 :(得分:3)
你真的不应该开始使用正则表达式来修改DOM。有DOM解析器可以做这种事情。这甚至不是那么难:
$html = '<p><br></p><div align="justify"><b>Some Text</b></div>
<p>foobar</p>
<p></p>';//empty
$dom = new DOMDocument;
$dom->loadHTML($html);
$pars = $dom->getElementsByTagName('p');
foreach ($pars as $tag)
{
if (!trim($tag->textContent))
{
$tag->parentNode->removeChild($tag);
}
}
这就是全部。您只需选择p
标记的所有,然后检查其trim
- ed文本内容是否为空,如果是:通过选择其父节点删除节点,然后调用DOMNode::removeChild
方法......
上面的代码段删除了3个段落节点中的2个,包含foorbar
的节点保留原样。我想那就是你要做的......
要获取实际的dom片段,在删除需要删除的标记后,您可以简单地执行此操作:
echo trim(
substr(
$dom->saveHTML($dom->documentElement),//omit doctype
12, -14//12 => <html><body> and -14 for </body></html>
)
);
答案 1 :(得分:-1)
在Live Regex示例中,您使用的是双分隔符,有关工作示例,请参阅http://www.phpliveregex.com/p/6II。此外,由于预定义的分隔符是/
,您需要在代码中转义斜杠(同样在示例中)。