Выражение Regex перестает работать в PHP 7.3 - PullRequest
1 голос
/ 14 июня 2019

У меня есть рекурсивное регулярное выражение для получения текста в скобках []:

    preg_match_all("#\[(([^\[\]]*|(?R))*)\]#", $string, $matches);

Это работает нормально, и я без проблем использую его в PHP 5.6 и 7.0.Я обновил свой сервер до PHP 7.3, и он перестал работать для длинных текстов (длиной более 500 000 символов).

В длинном тексте, содержащем скобки, выражение возвращает все результаты с PHP 5.6 и 7.0, так как оноshould.

В PHP 7.3 он возвращает пустой массив $ match без отправки каких-либо сообщений об ошибках или предупреждений.

Я не знаю, почему это так.PCRE настроен одинаково во всех моих версиях PHP.Проблема возникает только для длинных текстов.Я не нашел упоминаний об этой проблеме в руководствах по миграции PHP.

1 Ответ

1 голос
/ 16 июня 2019

Вы можете сделать две вещи: увеличить предел стека JIT-компилятора и 2) переписать регулярное выражение, следуя принципу развертывания цикла .

Узор будет выглядеть как

$regex = "#\[([^][]*(?:(?R)[^][]*)*)]#";

Это соответствует так:

  • \[ - открытая скобка
  • ([^][]*(?:(?R)[^][]*)*) - сопоставление группы захвата
    • [^][]* - ноль или более символов, кроме квадратных скобок
    • (?:(?R)[^][]*)* - ноль или более повторений всего шаблона регулярного выражения ((?R)), за которым следуют ноль или более символов, кроме квадратных скобок
  • ] - закрывающая скобка.

См. Демоверсию регулярных выражений .

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