如何删除标签后的所有空格

时间:2013-07-25 21:37:32

标签: php regex preg-replace

我需要删除整个文本中所有<br />标记后的所有空格。

trim()不起作用。

$str = "something<br /> ";
$str = preg_replace('/(<br(?: \\/)?>/\s+/', '', $str);

输出:“某事”而不是"something "

我不想删除<br />或替换空格。

5 个答案:

答案 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);