我试图借助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?"在某种程度上解释了其中的部分内容,但并未完全找到根本原因/解决方案。