首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:意外的PREG_BACKTRACK_LIMIT_ERROR

PHP:意外的PREG_BACKTRACK_LIMIT_ERROR
EN

Stack Overflow用户
提问于 2012-03-14 04:31:43
回答 1查看 4.6K关注 0票数 4
代码语言:javascript
复制
function recursiveSplit($string, $layer) {
    $err = preg_match_all("/\{(([^{}]*|(?R))*)\}/",$string,$matches);
    echo "Elementi trovati: $err<br>";
    if($err == FALSE) echo "preg_match_all ERROR<br>";

    // iterate thru matches and continue recursive split
    if (count($matches) > 1) {
        for ($i = 0; $i < count($matches[1]); $i++) {
            if (is_string($matches[1][$i])) {
                if (strlen($matches[1][$i]) > 0) {
                    echo "<pre>Layer ".$layer.":   ".$matches[1][$i]."</pre><br />";
                    recursiveSplit($matches[1][$i], $layer + 1);
                }
            }
        }
    }
}

$buffer = "{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{aaaaaaaaaaaaaaaaaa{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}";
recursiveSplit($buffer, 0);

输出

代码语言:javascript
复制
Elementi trovati: 
preg_match_all ERROR
Backtrack limit was exhausted!

这段代码给了我一个PREG_BACKTRACK_LIMIT_ERROR错误...但回溯限制设置为100.000.000。

这是我第一次使用正则表达式,我真的不知道如何解决它。

非常感谢你,马可

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-14 04:56:52

catastrophic backtracking的另一个经典案例。今天一定是my lucky day

代码语言:javascript
复制
/\{(([^{}]*|(?R))*)\}/

仅当大括号嵌套正确时才匹配。当然,它们不在你的字符串中。

现在的问题是,您的正则表达式需要找出可以用106个a构建的所有可能的字符串组合,因为您有嵌套的量词((...)*)*)。它(如果我错了,请纠正我)应该在106!附近的某个地方,

114628056373470835453434738414834942870388487424139673389282723476762012382449946252660360871841673476016298287096435143747350528228224302506311680000000000000000000000000

这很容易打败你的PREG_BACKTRACK_LIMIT。

如果你使用possessive quantifiers来确保你永远不会回到你已经匹配的非大括号中,那么你应该没问题:

代码语言:javascript
复制
/\{(([^{}]*+|(?R))*)\}/
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9691627

复制
相关文章

相似问题

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