> 注意包含嵌套的不确定重复的模式。当应用于不匹配的字符串时,这些模式可能需要很长时间才能运行。
说它需要 "很长时间" 是一种轻描淡写:所需的时间将呈指数级增长,具体来说是 2^n,其中 n 是 "a" 字符的数量。这种行为会导致 "正则表达式拒绝服务" (ReDoS),如果您对用户提供的输入运行此类表达式。
为了不被 ReDoS 击中,请执行以下三项操作中的某一项(或可能不止一项)
* 编写不会造成漏洞的表达式。 https://regexper.cn/redos.html 是一份很好的资源("原子" 和 "占有" 选项在 PHP/PCRE 中都可用)。如果您无法用眼睛发现所有问题,请使用 "ReDoS 检测器" 或 "正则表达式 linter"。
* 为 preg_match 设置一些限制。在 https://php.net/manual/en/pcre.configuration.php. 上提到的值上使用 `ini_set(...)`。降低限制可能会导致正则表达式失败,但这通常比使整个服务器停顿更好。
* 使用不同的正则表达式实现。曾经有一个 RE2 扩展;现在没有了!