Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么是「;单位「;pcre的回程限制?_Php_Preg Replace_Backtracking - Fatal编程技术网

Php 什么是「;单位「;pcre的回程限制?

Php 什么是「;单位「;pcre的回程限制?,php,preg-replace,backtracking,Php,Preg Replace,Backtracking,我遇到了一个问题,使用复杂正则表达式的preg\u replace()会由于pcre.BACKTRACK\u LIMIT太低而导致错误(preg\u BACKTRACK\u LIMIT\u error)。我将其设置为10000000,它适用于这个特定的应用程序 我的问题是,回溯限制的确切定义是什么,松散地定义为“单位”?1000000数字是否对应内存大小?如果没有,这意味着什么?我正试图了解在我的环境中这是一个什么样的合理设置 关于preg\u replace的参考: 回溯参考: 不知道这是否

我遇到了一个问题,使用复杂正则表达式的
preg\u replace()
会由于
pcre.BACKTRACK\u LIMIT
太低而导致错误(
preg\u BACKTRACK\u LIMIT\u error
)。我将其设置为
10000000
,它适用于这个特定的应用程序

我的问题是,
回溯限制的确切定义是什么,松散地定义为“单位”?
1000000
数字是否对应内存大小?如果没有,这意味着什么?我正试图了解在我的环境中这是一个什么样的合理设置

关于
preg\u replace
的参考:

回溯参考:
不知道这是否有帮助: 根据此错误代码,当pcre触发pcre\u错误\u匹配限制时出现。
根据pcre的说法,这可能是您的错误,因为您的正则表达式可能导致内存泄漏

我可以建议您检查您的正则表达式作为解决问题的最佳方法,否则,如果您坚持让它工作,您可以(但我不建议)这样做: ini设置('pcre.backtrack\u limit',PHP\u INT\u MAX)

[编辑] 我相信这个设置完全是关于pcre的繁重处理能力,这就是为什么我建议检查您的正则表达式以使其更轻(分成多个正则表达式,在数据上添加更多迭代,等等)。

从中,当递归调用“match()”超过1000000次时返回此错误:

/* 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\u PCRE\u BACKTRACK\u LIMIT\u ERROR”错误

根据pcreapi手册页(见):

在内部,PCRE使用它调用的名为match()的函数 反复地(有时递归地)。match_limit设置的限制为 在匹配过程中调用此函数的次数, 这样可以限制回溯的数量 发生。对于未锚定的模式,计数将重新启动 对于主题字符串中的每个位置,从零开始

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

下面是一个用简单的“”正则表达式隔离错误情况的演示:


首先,你在这里要问的不是一个“单位”——比如一英里或一公斤,但这里没有单位,只是一个简单的数字。它还设置了回溯尝试的限制,然后才放弃一个变得越来越复杂/内存越来越昂贵的搜索。你刚刚回答了我的问题。“回溯尝试次数”是一个单位:)。如果您能提供一个链接来引用此内容,我很乐意接受您的回答。作为旁白,如果您有此类错误,我建议您重写您的模式,而不是更改回溯限制。@Casimir,很遗憾,我不确定是否可以将其发布在这里。这不是我的。我只是对PHP设置更感兴趣。“这可能是您的错误,因为您的正则表达式可能导致内存泄漏。”--我认为changelog条目指的是已解决的特定错误。使用使用过多回溯的正确正则表达式可能会触发此错误。
<?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";
}
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