PHP的preg_replace正则表达式删除空段落标记
问题描述:
正则表达式的解决方案上 PHP RegEx remove empty paragraph tags#<p>(\s| |</?\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
答
你真的不应该使用正则表达式来修改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
答
在您的Live正则表达式正则表达式例如你正在使用双分离器,看到http://www.phpliveregex.com/p/6II的工作示例。另外,由于预定义的分隔符是/
,所以您需要在代码中跳过斜杠(同样在示例中)。
编辑:一般来说,最好遵循杰伊的建议,而不是使用正则表达式来完成这类任务。
对我来说工作得很好。 'preg_replace($ re,'',$ str);' – 2014-09-05 12:54:30
我也http://regex101.com/r/qW4dI6/3 – 2014-09-05 12:55:30
使用正则表达式来操纵DOM元素并不是一个好主意,你应该使用DOM解析器.http://simplehtmldom.sourceforge.net/ – 2014-09-05 12:57:36