PHP preg_match_all不处理大数据

时间:2018-05-16 06:59:15

标签: php laravel

为什么preg_match_all无效?

$pattern = '/\{(?:[^{}]|(?R))*\}/';

$result = 161240个字符

       if (preg_match_all($pattern, $result, $matches)) {
            echo 'Success';
        } else {
            echo 'Not working';
        }

显示:"不工作"

1 个答案:

答案 0 :(得分:0)

播放模式使用正则表达式递归匹配平衡的大括号。模式本身看起来很好,可以作为intended

<?php
$re = '/{(?>[^{}]|(?R))*\}/m';
$str = 'Why is preg_match_all not working?{{{{{
$pattern = \'/\\{(?:[^{}]|(?R))*\\}/\';
$result = 161240 characters
       if (preg_match_all($pattern, $result, $matches)){ {
            echo \'Success\';
        } else {
            echo \'Not working\';
        }
}}}}}}{}{}{}{}{}{}{}{{{{{{}}}}}';

//preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
if (preg_match_all($re, $str, $matches)) {
echo 'Success\n';
} else {
echo 'Not working\n';
}

// Print the entire match result
var_dump($matches);

这也适用于较大的输入(此处tested,大约5000个字符)。 最可能的解释是:模式找不到有效匹配。

但是,您正在一个非常大的输入字符串上运行递归正则表达式。很多东西都可能出错。 PCRE引擎达到内部限制,字符串未正确编码,超时等。