2013-09-23 52 views
2

我正在處理幾GB的文本,並且我的腳本死於preg_replace()。經過一些研究後,我提取出現問題的部分文本。PHP:preg_replace吃掉所有內存

preg_replace('/\b\p{L}{0,2}\b/u', '', "\x65\xe2\xba\xb7\x69\xe3\xb1\xae"); 

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 251105872 bytes)

我想刪除短(最多2個字符)的話。此外,我發現,如果我將正則表達式更改爲:

preg_replace('/\b\p{L}{1,2}\b/u', '', "\x65\xe2\xba\xb7\x69\xe3\xb1\xae"); 

它工作正常。

有人可以解釋發生了什麼事嗎?第一個例子適用於99%的文本。

+0

你是否將整個「情侶文本」同時傳遞給函數?這意味着你首先將整個文件讀入內存? – jedwards

+0

^^分塊處理 – 2013-09-23 04:43:39

+0

沒有。我得到了文本文件,每個文件大約100 kb – 2ge

回答

1
\b\p{L}{0,2}\b 
     ^

這0這裏將正則表達式匹配在更多的地方比你需要和你可能兩次或更多次的匹配和替換。

E.g:你獲得344場比賽與\b\p{L}{0,2}\bregex101 demo),但只有與\b\p{L}{1,2}\bregex101 demo)19 「Lorem存有」 文本。

如果它是替代品,你會得到更多的東西!

+0

當然,我明白了。但是我不明白,怎麼可能PHP在8個字符長的字符串上沒有足夠的內存。 'PHP致命錯誤:允許的內存大小134217728字節用盡(試圖分配251105872字節)' – 2ge

+0

@ 2ge那麼,我想這是因爲'\ p {L}'包含很多很多字符,它正在檢查每個字符1 more時間在每個匹配的位置,這將變成數以百萬計的「檢查」。 – Jerry