0

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

trim()不起作用。

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

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

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

4

5 回答 5

2

这将删除空格字符和制表符。请注意,\s删除所有空白字符,包括换行符,因此如果您使用它而不是空格和字符,您可能需要阅读很长的代码行\t

$str = preg_replace('!(\<br ?/?\>)([ ]|\t)+!i', '<br />', $str);
于 2013-07-25T21:54:33.427 回答
0

只有str_replace()当您知道只有一个空格(字面意思是空格字符)后,才能使用要删除的中断标记。

否则,正则表达式是用于该任务的更好工具。

我推荐这种模式:~<br(?: /)?>\K\s+~i

  • 使用不是正斜杠的模式分隔符以避免使用反斜杠来转义模式内的正斜杠。
  • <br(?: /)?>将匹配<br><br />
  • \K将重新启动全字符串匹配——这消除了对捕获组的需要。如果可能,请始终避免使用捕获组,它们会花费额外的步骤并且会减慢您的模式。因为没有匹配中断标记,所以替换值只需要一个空字符串。
  • \s+将匹配每个中断标记后的一个或多个空白字符(空格、制表符、换行符)
  • flag / pattern 修饰符将i匹配中断标记,无论它们是用大写、小写还是两者的混合形式编写的。

这是一个 Pattern&Replacement 演示链接:https ://regex101.com/r/1gMus1/1

代码:(演示

<?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

用于记录的 ps/<br[^>]*>\K\s+/i/稍微快一些,但关于 br 标记语法的字面意思更少。

如果您对“空格”非常了解并且不想匹配换行符或制表符,那么这会很好:~<br(?: /)?>\K +~i

于 2017-11-28T14:16:46.203 回答
-1

Change regex to

preg_replace("(something<br \/>)\s*", "$1", $str)

this will replace your string to contain something<br /> only.

于 2013-07-25T21:38:54.280 回答
-1

尝试这个

$str = "something<br />";
$output = str_replace("<br />", "", $str);
echo $output;

如果您只想避免空间,请尝试以下操作:

$output = trim($str);
于 2013-07-25T21:46:51.903 回答
-1

我的解决方案:

$string = str_replace("<br /> ", "<br />", $string);
于 2013-07-25T21:49:16.667 回答