我正在处理几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%的文本。

最佳答案

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

这里的0将使regex在比您需要的更多的地方匹配,您可能会得到两次或更多的匹配和替换。
例如:使用\b\p{L}{0,2}\bregex101 demo)与“lorem ipsum”文本匹配344次,但使用\b\p{L}{1,2}\bregex101 demo)仅匹配19次。
如果它是一个替代品,你还有很多事情要做!

10-08 13:26