2008-10-16 30 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修改器將其放入多行模式,因此^匹配任何行的開始。