PHP的preg_replace正则表达式删除空段落标记

问题描述:

正则表达式的解决方案上 PHP RegEx remove empty paragraph tags
#<p>(\s|&nbsp;|</?\s?br\s?/?>)*</?p>#PHP的preg_replace正则表达式删除空段落标记

建议未能在我的例子字符串:
<p><br></p><div align="justify"><b>Some Text</b></div><p></p>

,我想不通为什么。
看住这里 http://www.phpliveregex.com/p/6ID

+0

对我来说工作得很好。 'preg_replace($ re,'',$ str);' – 2014-09-05 12:54:30

+0

我也http://regex101.com/r/qW4dI6/3 – 2014-09-05 12:55:30

+4

使用正则表达式来操纵DOM元素并不是一个好主意,你应该使用DOM解析器.http://simplehtmldom.sourceforge.net/ – 2014-09-05 12:57:36

你真的不应该使用正则表达式来修改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方法删除节点...
的片段上方去除2在3段节点中,包含foorbar的节点保持原样。我thinkg这就是你正在尝试做的...

获得实际的DOM片段,消除了需要删除的标签后,你可以简单地这样做:

echo trim(
    substr(
     $dom->saveHTML($dom->documentElement),//omit doctype 
     12, -14//12 => <html><body> and -14 for </body></html> 
    ) 
); 

proof of concept

+0

感谢此 - 认为它需要稍微调整,以处理多个空段落。例如'

' – u01jmg3 2016-07-06 11:54:17
+0

@ u01jmg3:您是否使用该输入测试了它?你给的例子(2个空的段落标签)应该可以正常工作。代码应该在两个节点上都看到,并看到有空(并将其删除) – 2016-07-06 13:16:00

+0

不可以; https://eval.in/601369 – u01jmg3 2016-07-06 13:25:33

在您的Live正则表达式正则表达式例如你正在使用双分离器,看到http://www.phpliveregex.com/p/6II的工作示例。另外,由于预定义的分隔符是/,所以您需要在代码中跳过斜杠(同样在示例中)。

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