在 PHP 中使用正则表达式替换空格
-
03-07-2019 - |
题
我对正则表达式还很陌生。我需要替换多行文本中的空格。替换规则如下:
- 将行首的所有空格替换为不间断空格 (
). - 将任何重复空格(多个空格在一起)替换为相同数量的不间断空格。
- 不在行首的单个空格保持不变。
我用的是 正则表达式教练 构建匹配模式:
/( ){2,}|^( )/
假设我有这个输入文本:
asdasd asdasd asdas1
asda234 4545 54
34545 345 34534
34 345
使用 PHP 正则表达式替换函数(例如 preg_replace()
),我想得到这个输出:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
我很高兴使用正则表达式进行简单的文本替换,但我无法弄清楚如何在匹配中多次替换以获得我想要的输出。
解决方案
我猜想找到每个空间并替换它会更容易。为此,请使用“look-ahead”和“look-behind”组。
或者,找一个空间(\x20
) 由任何单个空格 (\s
);但是,仅替换空间。
$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n";
print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", " ", $str);
(我选择#160,因为 markdown 解析 nbsp。)
结果是:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
回复评论
@斯普罗兹: :一开始我也是这么想的。但该示例显示了 "\n " => "\n "
第一行和第二行之间。
其他提示
你可以使用 PHP 的 /e
修饰符为 执行 替换中的一些代码,如下所示:
$str = preg_replace('/( {2,}|^ )/em', 'str_repeat(" ", strlen("\1"))', $str);
我更改了正则表达式以捕获空格。这 /m
modifer 将其设置为多行模式,因此 ^
匹配任意行的开头。
不隶属于 StackOverflow