我正在处理几个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%的文本。
答案 0 :(得分:1)
\b\p{L}{0,2}\b
^
此处的0将使正则表达式匹配的位置超出您的需要,并且可能需要两次或更多才能进行匹配和替换。
例如:您使用\b\p{L}{0,2}\b
(regex101 demo)与“Lorem ipsum”文本进行344次匹配,但只有19次使用\b\p{L}{1,2}\b
(regex101 demo)。
如果它是替代品,你还会做更多的事情!