Поиск по сайту:

Регулярные выражения PHP не работают с очень длинными строками (решено)


Функции preg_replace, preg_match_all и preg_match не работают с длинными строками

При попытке поиска в PHP с использованием регулярных выражений с использованием preg_replace, preg_match_all и preg_match (или других функций поиска по регулярным выражениям) может возникнуть следующая проблема: искомая строка точно содержит подстроку, соответствующую шаблону поиска; но вместо вывода совпавших строк функция ничего не находит. Ошибки тоже не выводятся.

Начиная с PHP 5.2 существует ограничение на размер текста, к которому могут применяться функции PCRE. По умолчанию максимальный размер текста, при котором работают функции PCRE, составляет 100 КБ. Если этот предел превышен, никаких сообщений об ошибках выведено не будет, но и ничего не будет найдено.

Как увеличить лимит строки для поиска по регулярным выражениям

Возникает логичный вопрос, как увеличить предел максимальной длины строки для функций PCRE.

Вы можете увеличить максимальную длину строки для поиска по регулярным выражениям в PHP в файле php.ini.

Сначала найдите этот файл:


locate php.ini

Пример расположения файла для дистрибутивов Linux на основе Debian (Ubuntu, Linux Mint, Kali Linux) — обратите внимание, что расположение файла зависит от версии PHP:


/etc/php/8.2/apache2/php.ini

Пример расположения файла для дистрибутивов Linux на базе Arch Linux (Manjaro, BlackArch):


/etc/php/php.ini

Откройте файл php.ini от имени пользователя root:


sudo gedit /etc/php/php.ini

Найдите строку с pcre.backtrack_limit:


;pcre.backtrack_limit=100000

Раскомментируйте эту строку (уберите точку с запятой в начале строки) и установите желаемый предел:

Сохраните и закройте этот файл.

Если вы запускаете PHP-скрипты в командной строке, внесенные вами изменения должны вступить в силу немедленно.

Если вы запускаете сценарии с помощью веб-сервера Apache, вам необходимо перезапустить эту службу.

Чтобы перезапустить службу Apache в дистрибутивах на базе Debian (Ubuntu, Linux Mint, Kali Linux), выполните следующую команду:


sudo systemctl restart apache2.service

Чтобы перезапустить службу Apache в дистрибутивах Arch Linux (Manjaro, BlackArch), выполните следующую команду:


sudo systemctl restart httpd.service

После этого изменения должны вступить в силу.

Если ваша проблема не решена, то попробуйте увеличить лимит до более высокого значения.

Безопасно ли увеличивать pcre.backtrack_limit

Существует мнение, что увеличение pcre.backtrack_limit может привести к переполнению стека и падению службы Apache.

Судя по всему, эти ошибки уже исправлены, так как в современных версиях PHP и Apache проблем после увеличения pcre.backtrack_limit я не наблюдаю.

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