Регулярные выражения 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 я не наблюдаю.
Напротив, это решило мою проблему с поиском по регулярным выражениям в очень длинных строках и очень больших текстовых файлах.