2013-09-23 50 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