首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pcre.backtrack_limit的“单位”是什么?

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

Stack Overflow用户
提问于 2014-05-06 06:41:16
回答 2查看 9.3K关注 0票数 8

我遇到一个问题,带有复杂正则表达式的preg_replace()由于pcre.backtrack_limit太低而导致错误(PREG_BACKTRACK_LIMIT_ERROR),默认情况下设置为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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-04 23:31:54

the PCRE source code中,当递归调用"match()“超过1,000,000次时,会返回此错误:

代码语言:javascript
复制
/* 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“错误here

根据pcreapi手册页(参见https://serverfault.com/a/408272/140833 ):

内部,PCRE使用一个名为match()的函数,它反复(有时是递归地)调用该函数。由match_limit设置的限制是在匹配期间调用此函数的次数,其效果是限制可以发生的回溯次数。对于未锚定的模式,对于主题字符串中的每个位置,计数从零重新开始。

因此,我认为该单位类似于“回溯尝试次数”。不过,我不确定这是不是1对1。

这是一个用一个简单的"Catastrophic Backtracking“正则表达式隔离错误案例的演示:

代码语言:javascript
复制
<?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,以获得以下输出:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2014-10-14 22:59:41

不知道这是否有帮助:根据pcre's source code的说法,当pcre触发PCRE_ERROR_MATCHLIMIT时,会出现这个错误代码。根据pcre的this changelog的说法,这可能是您的错误,因为您的正则表达式可能导致内存泄漏。

我建议将正则表达式作为解决问题的最佳方法,否则,如果你坚持要让它工作,你可以这样做(但我不推荐):ini_set(‘pcre.backtraceLimit’,PHP_INT_MAX);

编辑我相信这个设置是关于pcre的繁重的处理能力的,这就是为什么我建议回顾你的正则表达式,试着让它变得更轻(拆分成多个正则表达式,在你的数据上添加更多的迭代,等等)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23483114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档