说明正则表达式为什么太大PHP / PCRE

时间:2018-10-06 22:42:41

标签: php pcre

我试图借助PHP regex将文件内容与防病毒签名进行匹配,但是我遇到了问题:

preg_match(): Compilation failed: regular expression is too large at offset 107

失败的模式通常如下所示:

75633d617313134(?:..){0,27615}75626f756e687228756328692929

我在https://regex101.com/的帮助下尝试了各种修改,但没有成功。将模式简化为简单的时候,我仍然会遇到相同的错误:

(?:.){0,4000}

有人可以解释为什么吗?根据我在该论坛上的阅读资料,该限制应为〜65000?如果将匹配数更改为{0,},为什么还能正常工作?

我的服务器正在使用PHP 7.2.7运行Apache。 PCRE库版本为8.42(pcre.backtrack_limit:1000000,pcre.recursion_limit:100000)。

原始模式来自ClamAV的防病毒数据库,该数据库据说是为regex.c库设计的。为了使它们与PHP / PCRE一起使用,需要进行转换,因此无法手动重写每个模式。由于共享的虚拟主机,因此无法重新编译PHP以提高PCRE LINK_SIZE。

当前preg_replace与~\{([0-9]+)-([0-9]+)\}~一起使用,而将匹配项替换为(?:..){\1,\2}

我最初的问题是了解PCRE如何得出结论,即使上述简化的陈述也太大了。但是最终的最终目标是使模式更改/修复以使其达到预期目的。

帖子"Why am I being warned that my regular expression is too large?"在某种程度上解释了其中的部分内容,但并未完全找到根本原因/解决方案。

0 个答案:

没有答案