2009-12-14 31 views
6

我一直在使用下面的網站來測試PHP正則表達式,所以我不必不斷地上傳: ​​PHP的preg_replace非貪婪麻煩

我用正則表達式如下:

/(.*?)\.{3}/ 
在以下字符串

(什麼也沒有更換):

Non-important data...important data...more important data 

和的preg_replace將返回:

more important data 

但我希望它返回:

important data...more important data 

我想到了?是非貪婪的修飾語。這裏發生了什麼?

+0

您在鏈接的站點上使用了哪些設置?我剛剛嘗試過,並按照我的預期收回「非重要數據」。你的正則表達式是找到第一場比賽,然後在找到一個'...'之前儘可能少地抓住它。 – 2009-12-14 06:03:11

+0

@Doug Neiner:在他的網站鏈接中,請確保您在最後一部分選擇了'preg_replace'。我以這種方式重現了OP的結果。 – Asaph 2009-12-14 06:07:30

+1

啊,非常真實。選錯了一個。 – 2009-12-14 06:19:46

回答

8

您的非貪婪修飾符按預期工作。但preg_match取代全部發生與替換文本(非您的情況下爲"")的(非貪婪)匹配。如果只想更換第一個,則可以將1作爲可選第四個參數(限制)傳遞給preg_replace函數(PHP docs for preg_replace)。在您關聯的網站上,可以通過在文字輸入「標記」和「限制」之間輸入1來完成此操作。

+1

+1 @Asaph,很好的回答。當我嘗試鏈接時,我選擇了'preg_match'而不是'preg_replace',所以它通過了我的氣味。你的答案當然是完全正確的! – 2009-12-14 06:18:14

0

只是@Asaph解決方案的一個實際示例。在這個例子中,你不需要非貪婪,因爲你可以指定一個計數。 用一個標記替換第一個出現在一行中的@

$line=preg_replace('/@/','zzzzxxxzzz',$line,1);