2013-07-29 75 views
7

似乎PHP的preg_match在某些情況下對匹配重複字符的限制爲3276個字符。PHP preg_match長度3276限制

^(.|\s){0,3276}$作品,但^(.|\s){0,3277}$沒有。

它似乎並不總是適用,因爲/^(.){0,3277}$/的作品。

我無法在PHP的文檔或錯誤跟蹤器中的任何地方找到這個。數字3276似乎有點奇怪的邊界,我唯一能想到的是它大約是32767的1/10,這是一個有符號的16位整數的限制。

preg_last_error()返回0

我已經重現了http://www.phpliveregex.com/問題,以及我的本地系統和網絡服務器。

編輯:看起來像我們正在得到「警告:preg_match():編譯失敗:正常表達式在偏移16」太大的代碼,所以它似乎是與PHP preg_match_all limit相同的問題。

然而,正則表達式本身並不是很大......當PHP有重複的組使它變得太大時,PHP會做某種擴展嗎?

+0

它更可能是一個內存邊界,preg_match將返回一個數組與許多元素,所以你需要有足夠的內存,以允許一個大型數組,嘗試提高你的最大內存限制,並看到如果它改變。 –

+1

您是否檢查過'preg_last_error()'? –

+0

是你的錯誤報告嗎?如果使用太多內存,應該會出現某種錯誤 – x4rf41

回答

0

使用^(.|\s){0,3276}(.|\s){0,1}$

1

爲了處理Perl兼容的正則表達式嘗試,PHP只是捆綁了third-party library即取任務的照顧。您所描述的行爲實際上是documented

的 「*」 量詞相當於{0,},將 「+」 量詞{1,} 和 「?」量詞到{0,1}。 n和m限制爲 非負整數值小於構建 perl時定義的預設限制。這通常是最常見的平臺上的32766。

所以總是有一個硬性限制。爲什麼你的測試表明PHP的限制比典型的限制小10倍?不知道:)

+0

+1,因爲這可能是問題所在。在問題中看到的較小限制僅適用於以'.'和'\ s'結合的方式,這種方式幾乎可以保證產生大量的回溯。如果我們猜測這個極限受到回溯的影響(這是一個合理的猜測),那麼如果極限降到這樣的水平,也不會感到意外。 – Spudley