2008-10-16 32 views
3

我对于正则表达式很新颖。我有一个要求来替换多行文本中的空格。替换规则如下:在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 

我很高兴使用正则表达式进行简单的文本替换,但是我无法解决如何在匹配内部多次替换以获得我期望的输出。

回答

6

我猜想找到每个空间并更换它会更容易。要做到这一点,请使用“前瞻”和“后视”组。

或者,找到一个空格(\x20),该空格由任何单个空格(\s)引导或后接;但是,只能更换空间。

$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n"; 

print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", "&#160;", $str); 

(我选择了#160,因为降价解析群组。)

结果:

asdasd asdasd&#160;&#160;asdas1 
&#160;asda234 4545&#160;&#160;&#160;&#160;54 
&#160;&#160;34545 345&#160;&#160;34534 
34 345 

欲了解更多信息,请PCREperlre


回复评论

@Sprogz:起初,我以为是相同的。但该示例在第1行和第2行之间显示"\n " => "\n&nbsp;"

+0

很好的答案,但它是值得改变你的建议使用\ s,因为它只是空间序列的提问者想要替换和\ s当然包括选项卡,换行符,回车和其他一些启用了某些设置的其他人。我会用/(?<= \ x20)\ x20 | \ x20(?= \ x20)|^\ x20/ – Sprogz 2008-10-16 11:03:17

+0

谢谢! /(?<= \ x20)\ x20 | \ x20(?= \ x20)|^\ x20 /结尾处带有“m” – 2008-10-16 12:24:49

2

您可以使用PHP的/e修饰符在更换执行一些代码,就像这样:

$str = preg_replace('/({2,}|^)/em', 'str_repeat("&nbsp;", strlen("\1"))', $str); 

我已经改变了正则表达式来捕获的空间。 /m修改器将其放入多行模式,因此^匹配任何行的开始。