2011-06-28 92 views
2

我試圖用PHP的preg_replace替換前兩個字母和空格後的所有字母和空格。這是我在這樣的失敗嘗試:幫助PHP正則表達式

echo preg_replace('/^[a-zA-Z]{2}([a-zA-Z ])*.*$/i','','FALL 2012'); //expected output is "FA2012", but it outputs nothing 

我只是試圖取代括號([a-zA-Z ])部分..我猜我不是在做正確的只需更換這部分..

回答

2

您要求它替換整個字符串。改爲使用lookbehind來匹配前兩個字符。

echo preg_replace('/(?<=^[a-z]{2})[a-z ]*/i','','FALL 2012'); 

順便說一句,在i修改意味着它是區分大小寫的,所以你不需要同時匹配大寫和小寫字符。

+1

我想你有preg_match/preg_replace倒退。 preg_replace在替換中使用分組。第一組是1美元,第二組是2美元......等等。 –

+1

該表達式有一個拼寫錯誤(?<而不是?<=),並且它不會匹配任何內容,因爲在主題開始之前不能有任何字符(^需要包含在lookbehind中)。 – jaytea

+0

@Jonathan:你說得對。清楚地沒有足夠的咖啡。刪除了我答案的那一部分。 –

0

最後的/i使其不區分大小寫。 (?<=regex)意味着緊挨着當前位置前面的行開頭,後面跟着2個字母。

echo preg_replace('/(?<=^[a-z]{2})[a-z ]*/i','','FALL 2012'); 
0

你是說用空白('')替換整個匹配。您希望將圓括號放在要保留的部分的周圍,然後用$ 1 $ 2替換,該值等於第一個($1)和第二個($2)括號中的值。

preg_replace("/^([a-z]{2})[a-z\s]*(.*)$/i", '$1$2', $string); 
0

在這種情況下,你可以逃脫(?<=lookbehind);但是,在某些其他情況下,您可能會發現\ K轉義更合適。它的作用是將應用程序傳遞的起始偏移值重置爲主題中的當前位置,從而有效地轉儲當前匹配中到目前爲止消耗的字符串部分。例如:

preg_replace('^[a-z]{2}\K[a-z ]*/i', '', 'FALL 2012') 

現在只有被[a-z ]*匹配的子字符串被替換。