PHP:preg_replace吃掉所有内存

时间:2013-09-23 04:36:09

标签: php regex preg-replace out-of-memory

我正在处理几个GB的文本,我的脚本在preg_replace()上死掉。经过一些研究后,我提取了文本中有问题的部分,其中出现了泄漏。

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

PHP致命错误:允许的内存大小为134217728字节耗尽(尝试分配251105872字节)

我正在尝试删除短(最多2个字符)单词。我还发现,如果我将regexp更改为:

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

它运作正常。

有人可以解释一下有什么问题吗?第一个例子适用于99%的文本。

1 个答案:

答案 0 :(得分:1)

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

此处的0将使正则表达式匹配的位置超出您的需要,并且可能需要两次或更多才能进行匹配和替换。

例如:您使用\b\p{L}{0,2}\bregex101 demo)与“Lorem ipsum”文本进行344次匹配,但只有19次使用\b\p{L}{1,2}\bregex101 demo)。

如果它是替代品,你还会做更多的事情!