在PHP中使用正则表达式替换空格
问题描述:
我对于正则表达式很新颖。我有一个要求来替换多行文本中的空格。替换规则如下:在PHP中使用正则表达式替换空格
- 用一个非中断空格替换行开始处的所有空格(
)。 - 用相同数量的非断点空格替换任何重复空格的实例(多个空格在一起)。
- 不在行首的单个空格保持不变。
我用Regex Coach构建匹配模式:
/(){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
我很高兴使用正则表达式进行简单的文本替换,但是我无法解决如何在匹配内部多次替换以获得我期望的输出。
答
我猜想找到每个空间并更换它会更容易。要做到这一点,请使用“前瞻”和“后视”组。
或者,找到一个空格(\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,因为降价解析群组。)
结果:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
回复评论
@Sprogz:起初,我以为是相同的。但该示例在第1行和第2行之间显示"\n " => "\n "
。
答
您可以使用PHP的/e
修饰符在更换执行一些代码,就像这样:
$str = preg_replace('/({2,}|^)/em', 'str_repeat(" ", strlen("\1"))', $str);
我已经改变了正则表达式来捕获的空间。 /m
修改器将其放入多行模式,因此^
匹配任何行的开始。
很好的答案,但它是值得改变你的建议使用\ s,因为它只是空间序列的提问者想要替换和\ s当然包括选项卡,换行符,回车和其他一些启用了某些设置的其他人。我会用/(? Sprogz 2008-10-16 11:03:17
谢谢! /(? 2008-10-16 12:24:49