PHP preg_replace RegEx删除空段落标记

时间:2014-09-05 12:52:33

标签: php regex preg-replace html-parsing

建议使用正则表达式解决方案 PHP RegEx remove empty paragraph tags
 #<p>(\s|&nbsp;|</?\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

2 个答案:

答案 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>
    )
);

proof of concept

答案 1 :(得分:-1)

在Live Regex示例中,您使用的是双分隔符,有关工作示例,请参阅http://www.phpliveregex.com/p/6II。此外,由于预定义的分隔符是/,您需要在代码中转义斜杠(同样在示例中)。

编辑:总的来说,最好遵循周杰伦的建议而不是使用正则表达式来完成这类任务。