PHP preg_match_all не работает с большими данными - PullRequest
0 голосов
/ 16 мая 2018

Почему preg_match_all не работает?

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

$result = 161240 символов

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

Отображается: «Не работает»

1 Ответ

0 голосов
/ 16 мая 2018

Шаблон в игре соответствует сбалансированным фигурным скобкам с помощью рекурсии регулярных выражений. Сам шаблон выглядит отлично и работает как предназначен .

<?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);

Это также работает с большим вводом (здесь проверено с ~ 5000 символов). Наиболее вероятное объяснение: шаблон не находит правильного соответствия.

Однако вы используете рекурсивное регулярное выражение для очень большой входной строки. Многие вещи могут пойти не так. Механизм PCRE достигает внутренних пределов, ваша строка не закодирована должным образом, время ожидания и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...