3

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

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

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

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

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

它工作正常。

有人可以解释发生了什么吗?第一个示例适用于 99% 的文本。

4

1 回答 1

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

这里的这个 0 将使正则表达式在比您需要的更多的地方匹配,并且您可能得到两次或更多的匹配和替换。

例如:您得到 344 个匹配的“Lorem ipsum”文本\b\p{L}{0,2}\bregex101 demo),但只有 19 个匹配\b\p{L}{1,2}\bregex101 demo)。

如果它是一个替代品,你还有很多事情要做!

于 2013-09-23T05:25:10.683 回答