删除<ul>标记</ul>之间的html换行符

时间:2011-06-30 11:31:13

标签: php html regex html-lists line-breaks

我有一个CMS系统,允许人们也使用HTML代码,但在函数末尾提供nl2br,这使得:

<ul>
<li></li>
</ul>

进入这个:

<ul><br/>
<li></li><br/>
</ul>

现在,我想删除<br/>个代码之间存在的<ul>个。{/ p>

我已经找到了另一个问题几乎相同的问题,但对于新行。我已将其集成到我的CMS中,但对于一个客户端,所有内容都已填写,因此我必须在用\n替换<br/>之后解决此问题。

other question将此作为正则表达式与\n中的<ul></ul>匹配:

/(?<=<ul>|<\/li>)\s*?(?=<\/ul>|<li>)/is

我想是这样的:

/(?<=<ul>|<\/li>)(<br>|<br\/>|<br \/>)(?=<\/ul>|<li>)/is

会做的伎俩,但事实并非如此。我错过了什么?

修改

我对DOMDocument解决方案非常开放,如果有办法用xpath查询换行符,这可能会解决我的问题。

2 个答案:

答案 0 :(得分:2)

在您提供的示例中,<br>标记被一些空格包围(至少由新行字符包围),因此需要将其反映在相应的正则表达式中。

/(?<=<ul>|<\/li>)(\s*<br>\s*|\s*<br\/>\s*|\s*<br \/>\s*)(?=<\/ul>|<li>)/is 

在许多情况下,正则表达式不是解析HTML的最佳方式(我绝对同意上面/下面的注释),但它们总是足够用于某些特定目的。

答案 1 :(得分:0)

有很多关于SO的例子说明为什么用正则表达式解析HTML是一个坏主意,所以我不会在这里包含另一个。

相反,请考虑使用HTML解析器(例如HTMLCleanerHTML Agility Pack)来完成此任务。