我需要删除整个文本中所有<br />
标记后的所有空格。
trim()
不起作用。
$str = "something<br /> ";
$str = preg_replace('/(<br(?: \\/)?>/\s+/', '', $str);
输出:“某事”而不是"something "
我不想删除<br />
或替换空格。
答案 0 :(得分:2)
这会删除空格字符和制表符。请注意,\s
会删除包含换行符在内的所有空白字符,因此如果您使用它而不是空格和\t
字符,则可能需要读取很长的代码行。
$str = preg_replace('!(\<br ?/?\>)([ ]|\t)+!i', '<br />', $str);
答案 1 :(得分:0)
如果您知道只有一个空格(字面意思是空格字符)可以删除要删除的中断标记,则只能使用str_replace()
。
否则,正则表达式是用于该任务的更好工具。
我推荐这种模式:~<br(?: /)?>\K\s+~i
<br(?: /)?>
将与<br>
和<br />
\K
将重新启动全字符串匹配 - 这消除了对捕获组的需要。如果可能,始终避免使用捕获组,它们需要额外的步骤并且会减慢您的模式。由于break标记未匹配,因此替换值只需要一个空字符串。\s+
将匹配追踪每个中断标记的一个或多个空白字符(空格,制表符,换行符)i
标志/模式修饰符将匹配中断标记,无论它们是以大写,小写还是两者的混合写入。以下是模式和替换演示链接:https://regex101.com/r/1gMus1/1
代码:(Demo)
<?php
$string='This is a space after a <br> break.
This is 2 spaces after a <br> break.
This is a tab after a <br> break.
This is a newline after a <br>
break';
var_export(str_replace(['<br> ','<br /> '],['<br>','<br />'],$string)); // if you KNOW there is only one space
echo "\n\n";
var_export(preg_replace('~<br(?: /)?>\K\s+~i','',$string)); // if you want to remove all spaces, tabs, newlines
?>
你原来的模式很接近,但它有一些缺陷:
/(<br(?: \\/)?>/\s+/
// ^ ^-- an unexpected, pattern-crippling forward slash
// |-- the start of a capture group, but no closing parenthesis
P.S。记录/<br[^>]*>\K\s+/i/
稍微快一点,但关于br标记语法的文字较少。
如果您对“空格”非常直接,并且不想匹配换行符或制表符,那么这样做会很好:~<br(?: /)?>\K +~i
答案 2 :(得分:-1)
将正则表达式更改为
preg_replace("(something<br \/>)\s*", "$1", $str)
这会将您的字符串替换为仅包含something<br />
。
答案 3 :(得分:-1)
试试这个
$str = "something<br />";
$output = str_replace("<br />", "", $str);
echo $output;
如果您只想避开空间,请尝试以下方法:
$output = trim($str);
答案 4 :(得分:-1)
我的解决方案:
$string = str_replace("<br /> ", "<br />", $string);