从字符串末尾删除 <br> 标签

18

就像标题所说,我有一个字符串:

$string = "Hello World<br>hello world<br><br>";
我想把字符串末尾的<br>去掉,使其看起来如下所示:
$string = "Hello World<br>hello world";

我尝试了这个:

preg_replace('/^(<br>)*/', "", $string);

但是它并没有起作用。 也许有人知道正确的正则表达式。


请注意,您的问题中提到“现在我想摆脱's”...将<br>放在反引号(```)中,以便它显示 :) - NickAldwin
你想要什么还不太清楚。你是想把字符串中的<br>转换成\n(换行符),并且去掉字符串末尾的<br>吗?所以在你的例子中,最终的字符串应该是"Hello World\nhello world"吗?如果是这样,你可能需要两个正则表达式替换,一个用于换行符情况,另一个用于去除情况。请编辑问题以更具体化。 - Fabian Fagerholm
不,结果字符串应该是这样的:“Hello World<br>hello world”。NickAldwin和Alex Howansky的解决方案是正确的。再次感谢。 - iam_peter
6个回答

25

你已经很接近了,你在正则表达式开头使用了^符号,它的意思是“匹配字符串的开头”。你需要在末尾使用$符号,表示“匹配字符串的结尾”。

preg_replace('/(<br>)+$/', '', $string);

对于 <br />,我觉得这个正则表达式可以解决问题:preg_replace('/(<br \/>)+$/', '', $string); - Louis B.
如何查找并替换最后4个字符为<br>标记。 - Arafath
如果您想查看此正则表达式的工作原理-> https://regex101.com/r/L7gswR/1 - kanlukasz

13

对于其他跟我一样想要找到一种方法来从字符串末尾删除所有换行标签的人,包括:

<br> <br/> <br /> <br              /> <br      >

我使用了:

$string = preg_replace('#(( ){0,}<br( {0,})(/{0,1})>){1,}$#i', '', $string);

可以起到很好的效果。如果它们之间有空格,这也会将它们去掉。如果需要,您还需要调整任何\n\r等。


谢谢!你的解决方案对我非常有效,但我还需要从字符串开头删除它们,你知道该怎么做吗? - Maria Vilaró
1
我还没有时间测试,但这应该可以从字符串的开头删除它们:$string = preg_replace('#^(( ){0,}){1,}#i', '', $string); - Scott Flack
2
它也可以更容易:使用 (?:\s*<br *\/?>\s*)+$ 匹配结尾或者使用 ^(?:\s*<br *\/?>\s*)+ 匹配开头,这将匹配所有带或不带斜杠的 br 标签,并且包括标签前面或斜杠前后的任何空格。 - My1

7
我认为,从字符串末尾删除所有空格和BR标签的最佳解决方案是这样的:
preg_replace('#(\s*<br\s*/?>)*\s*$#i', '', $string);

这里是测试:

$arr = [
  '<something>else that</needs>to <br>  <BR      />      <br/>  ',
  '<something>else that</needs>to <br>',
  '<something>else that</needs>to    <br/>  ',
  '<something>else that</needs>to     ',
  '<something>else that</needs>to<br/>',
  ];

foreach ($arr as $string) {
 var_dump(preg_replace('#(\s*<br\s*/?>)*\s*$#i', '', $string));
}

这将打印:

test.php:11:string '<something>else that</needs>to' (length=30)
test.php:11:string '<something>else that</needs>to' (length=30)
test.php:11:string '<something>else that</needs>to' (length=30)
test.php:11:string '<something>else that</needs>to' (length=30)
test.php:11:string '<something>else that</needs>to' (length=30)

1
请注意,如果您在结尾处有大约3000个“<br>”,PHP会抛出异常。 - Mantas D

1

尝试使用preg_replace('/(<br>)+$/', "", $string);

编辑:哎呀,现在应该可以了。


0

正则表达式很强大,但我认为这种情况更简单,rtrim 应该可以解决。

$string = rtrim($string,'<br>');

12
这并不是你想象中的功能。它会从字符串末尾以任意顺序移除任何一个字符 <, b, r, 或 >(如果存在的话)。比如,I like rhubarb<br> 会变成 I like rhuba</footer> 会变成 </foote。 rtrim 有其用途,但这不是其中之一。 - jonathanm
感谢您提供的有用提示。 - Raul Sanchez

-1

正如他所提到的,他只想要结束标签...因此删除所有出现的标签的strip_tags函数并不有用。 - GDY

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