PHP:如何从字符串开头删除br标记?

5

I know that:

preg_replace('<br\s*\/?>', '', $string);

如果$string的开头是<br><br/><br />标签,我们该如何仅删除所有这些标签?(在我的情况下,$string是带有各种标签的html代码...)

将从$string中删除所有br标签...

3个回答

20

只需添加适当的锚点(^):

preg_replace('/^(?:<br\s*\/?>\s*)+/', '', $string);

这将匹配字符串起始处多个 <br> 标签。

(?:…) 是一个非捕获组,因为我们只使用括号来分组表达式而不是捕获它。修改器不是必需的 - (...) 同样可以工作,但是正则表达式引擎需要做更多的工作,因为它需要记住每个捕获结果的位置和长度。


在你的正则表达式周围需要分隔符,而且由于没有需要捕获的内容,所以请使用非捕获组 (?:...) - salathe
@salathe: 是的...我已经加上了它们。一开始我只是复制了问题的代码,所以忘记了它们。而且非捕获组也是个好主意。 - Konrad Rudolph
谢谢你的锚点提示,这正是我所缺少的...你的正则表达式并不能移除所有出现的情况,但结合这篇帖子:https://dev59.com/DXVC5IYBdhLWcg3w9GPM 正确的正则表达式应该是 /^(<br\s/?>\s)+/。修改它,我会将答案标记为已接受。 - Thanos
感谢您分享非捕获组的知识! - user373396
@KonradRudolph 我怎么两边都能修剪?我需要添加 $,但是在哪里添加呢? - horse
显示剩余2条评论

5

你在正则表达式中忘记了PCRE的定界符。尝试使用如下内容:

$string = preg_replace('/^\s*(?:<br\s*\/?>\s*)*/i', '', $string);

这也会删除换行标记前、中、后的前导空格字符。

一些解释:

  • ^\s*将匹配字符串开头的任何空格字符
  • (?:<br\s*\/?>\s*)*将匹配零个或多个BR标记(HTML和XHTML)后面跟着可选的空格字符

2
$string = preg_replace( '@^(<br\\b[^>]*/?>)+@i', '', $string );

应该匹配:

<br>
<br/>
<br style="clear: both;" />
etc

小心点 - 提问者希望它能在一组特定的HTML上工作,这样可以避免Cthulu的出现。疯狂就在你的“等等”之中。:)虽然我同意,<br style="clear:both;" />已经足够常见了,所以我投了赞成票。 - Jerph
这似乎适用于我所寻找的内容。这对任何合法的<br>标签都有效吗? - qitch

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