php pcre.backtrack_limit的“单位”是什么?

wbgh16ku  于 2023-06-20  发布在  PHP
关注(0)|答案(3)|浏览(176)

我遇到了一个问题,其中preg_replace()与复杂的正则表达式导致错误(PREG_BACKTRACK_LIMIT_ERROR),因为pcre.backtrack_limit太低,默认设置为1,000,000。我将其设置为10,000,000,它适用于这个特定的应用程序。
我的问题是,backtracking limit的松散定义的“单元”到底是什么?1,000,000数字是否对应于内存大小?如果不是,这意味着什么?我想知道在我的环境中,这是一个什么样的合理设置。
关于preg_replace的参考:http://us3.php.net/manual/en/pcre.configuration.php#ini.pcre.backtrack-limit
回溯参考:In regular expressions, what is a backtracking / back referencing?

am46iovg

am46iovg1#

从PCRE源代码中,当递归调用“match()”超过1,000,000次时,将返回此错误:

/* First check that we haven't called match() too many times, or that we
haven't exceeded the recursive call limit. */

if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT);

这在这里被转换为“PHP_PCRE_BACKTRACK_LIMIT_ERROR”错误。
根据pcreapi手册页(参见https://serverfault.com/a/408272/140833):
在内部,PCRE使用一个名为match()的函数,它会重复调用该函数(有时候是递归调用)。match_limit设置的限制是在匹配过程中调用此函数的次数,其效果是限制可能发生的回溯量。对于未锚定的模式,对于主题字符串中的每个位置,计数从零重新开始。
因此,我认为这个单位类似于“回溯尝试次数”。我不确定这是一比一。
下面是一个使用简单的“Catastrophic Backtracking“正则表达式隔离错误情况的演示:

<?php

ini_set('pcre.backtrack_limit', 100);

for ($len = 1000; $len <= 1001; $len++) {

    $x = str_repeat("x", $len);
    $ret = preg_match("/x+x+y/", $x);

    echo "len = " . $len . "\n";
    echo "preg_match = " . $ret . "\n";
    echo "PREG_BACKTRACK_LIMIT_ERROR = " . PREG_BACKTRACK_LIMIT_ERROR . "\n";
    echo "preg_last_error = " . preg_last_error() . "\n";
    echo "\n";
}

在这里运行此代码:https://3v4l.org/EpaNC,得到这个输出:

len = 1000
preg_match = 0
PREG_BACKTRACK_LIMIT_ERROR = 2
preg_last_error = 0

len = 1001
preg_match = 
PREG_BACKTRACK_LIMIT_ERROR = 2
preg_last_error = 2
kqqjbcuj

kqqjbcuj2#

不知道这是否有帮助:根据pcre的源代码,当pcre触发PCRE_ERROR_MATCHLIMIT时,会出现此错误代码。根据pcre的更新日志,这可能是你的错,因为你的正则表达式可能导致了内存泄漏。
我可以建议你检查你的正则表达式,作为解决问题的最佳方法,否则,如果你坚持要让它工作,你可以这样做(但我不建议):PHP_INT_MAX();
[编辑]我相信这个设置是关于PCRE的繁重处理能力,这就是为什么我建议你重新检查正则表达式,尝试使它更轻(分裂成多个正则表达式,在你的数据上添加更多的迭代,等等…)

wooyq4lh

wooyq4lh3#

ini_set("pcre.backtrack_limit", "5000000");为我工作。我把它放在我的mpdf页面的开始阶段,在1:04分钟内,我的276页文档就生成了。

相关问题