如何使用正则表达式将多个 <br /> 标签替换为一个标签?

17

我希望 <br /><br /> 变成 <br />

使用正则表达式的模式是什么?

注意:连续出现多于2次的 <br /> 标签也需要处理。


1
看看这个答案:https://dev59.com/DXVC5IYBdhLWcg3w9GPM - Bogdan
1
还可以查看这个答案:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Williham Totland
5个回答

40
$html = preg_replace('#(<br */?>\s*)+#i', '<br />', $html);

这段代码可以匹配任何形式的 <br><br/><br />,无论它们之间有多少或者什么类型的空格,然后将它们替换为单个 <br />


11
+1 表示包括标签之间可能存在的空白符。更好的做法是:'#<br\s*/?>(?:\s*<br\s*/?>)+#i'(仅在有多个换行符时才进行替换)。 - ridgerunner
1
前面的评论实际上是这个问题的唯一准确解决方案。 - Ben

23

如果您试图在HTML中使用正则表达式,您可能在做一些错误的事情。您可以使用s/(<br \/>)+/<br \/>/,但这不是一个好方式。

编辑: 如果你的换行符混杂不清,你可以使用稍微更加强大的匹配模式:

/(<br\ ?\/?>)+/

这个模式将捕获<br/><br>,在某些情况下可能会有用。


在JavaScript中,建议为全局搜索和不区分大小写的替换添加“gi”标志:msg.replace(/(<br ?\/?>)+/gi, ''); - Rafael Moni

0

(<br />)+

这将匹配它们,因此您可以使用preg_replace来替换它们(记得正确转义字符)。


0

这个很好用。它可以与下面所有的组合一起使用。

$html = '<br><br>
Some text
<br>
<br>
Some another<br/><br>';

$html = preg_replace("/(<br.*?>\s*)+(\n)*+(<br.*?>)/","<br>",$html);

$html 将被更改为

<br>
Some text
<br>
Some another<br>

0

@FtDRbwLXw6的回答很好,尽管它没有考虑到&nbsp;空格。我们可以扩展这个正则表达式来包括它:

$html = preg_replace('#(<br *\/?>\s*(&nbsp;)*)+#', '<br>', $html);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接