gpt4 book ai didi

php - PHP 中的 "Regular Expression is too large"错误

转载 作者:可可西里 更新时间:2023-10-31 23:09:12 26 4
gpt4 key购买 nike

我正在研究一个相对复杂且非常大的正则表达式。目前是 41,127 个字符,并且可能会随着额外案例的添加而有所增加。我开始在 PHP 中遇到此错误:

preg_match_all(): Compilation failed: regular expression is too large at offset 41123

有没有办法增加大小限制?以下其他地方建议的设置不起作用,因为这些设置适用于数据大小而不是正则表达式大小:

ini_set("pcre.backtrack_limit", "100000000");
ini_set("pcre.recursion_limit", "100000000");

或者,是否有一种方法可以在正则表达式中定义一个可以在正则表达式中的不同位置重复的“子模式变量”? (我不是在谈论使用 *+ 的重复,甚至是重复匹配的“1”)?我实际上使用的是包含子模式的 PHP 变量,这些子模式在正则表达式中的几个地方重复,但这会导致正则表达式在传递给 PRCE 函数之前进行扩展。

这是一个复杂的正则表达式,不能用 strposthis link 中建议的类似方法用更简单的关键字搜索替换 .

我宁愿避免在 | 将其拆分为子表达式并尝试分别匹配子表达式,因为大小的减少会适度(有只有 2 或 3 个顶级 |),这会使进一步的开发复杂化。

最佳答案

根据应用,有效的解决方案是:

  • 通过对任何冗余子表达式使用 DEFINE 来缩短正则表达式(见下文)。
  • 通过重新编译 PHP 增加正则表达式大小的最大限制(请参阅 drew010 的出色回答)。尽管这可能并非在所有环境中都可用,或者如果更改服务器可能会产生兼容性问题。
  • | 拆分您的正则表达式并分别处理生成的子表达式。如果正则表达式本质上是由 | 分隔的大量关键字,那么转换为 strtok 或带有 strpos 的循环可能是更好更快的选择。
  • 使用其他语言/正则表达式引擎,例如 C++/Boost,尽管我没有验证这一点。

针对我的特定问题的解决方案:根据 Mario 的评论,使用 (?(DEFINE)...) 构造一些重新定义的子表达式-多次使用将我的正则表达式大小从 41,127 个字符减少到“仅”4,071 个,这是消除“正则表达式太大”错误的优雅解决方案。

参见: (?(DEFINE)...) syntax reference at rexegg.com

关于php - PHP 中的 "Regular Expression is too large"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31172837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com