2
var_dump(
preg_replace('/.?$/s', "x", 'abc'),
preg_replace('/.$/s', "x", 'abc')
);
輸出:的preg_replace產生意想不到的重複使用非常簡單的正則表達式
string(4) "abxx" <-- strange, isn't it?
string(3) "abx"
這怎麼可能?
var_dump(
preg_replace('/.?$/s', "x", 'abc'),
preg_replace('/.$/s', "x", 'abc')
);
輸出:的preg_replace產生意想不到的重複使用非常簡單的正則表達式
string(4) "abxx" <-- strange, isn't it?
string(3) "abx"
這怎麼可能?
preg_replace
替換字符串中的所有匹配項。因此,在進行每次替換之後,它會在做出前一次替換的位置之後搜索另一匹配。
因此它首先查找/.?$/
並找到c
,並用x
替換它,結果爲abx
。然後,再次看起來/.?$/
從x
開始。由於.?
表示匹配0或1個字符,因此它匹配字符串末尾的零長度字符串,並用x
替換它。然後它停止,因爲它已經到達了字符串的末尾。
我也這麼想過,但根據這個邏輯,它必須進入一個無限循環。因爲'。?$'就像'。$'和'$'一樣。這裏'。$'已經在跳過最後一個字符了,所以如果我們可以在那之後運行某個東西,那麼沒有理由在'$'之後停止。雖然它可能像你說的那樣工作,但這仍然看起來像一個錯誤。 – 2013-02-23 07:25:45
我在想我自己。我懷疑有一個特殊的檢查來避免這個循環。 – Barmar 2013-02-23 07:30:35