Номер телефона

Последнее обновление:

Регулярное выражение PHP не работает с длинными строками

Перевод. Источник.

Регулярное выражение PHP не работает с длинными строками

Сегодня у меня была странная ошибка, на поиск которой мне потребовалось время. Я использовал preg_replace_callback для сопоставления блоков кода в строке и передачи их для выделения синтаксиса. Однако я обнаружил, что некоторые блоки, которые должны совпадать, не совпадают. Я не мог найти этому никакого объяснения. Я использовал следующий подшаблон нежадного сопоставления с чем-либо:

(.*?)

На самом деле не должно быть никаких причин, по которым это не соответствовало бы. Я постепенно начал удалять фрагменты текста из своей строки, чтобы попытаться найти причину, и внезапно после того, как несколько фрагментов исчезли, шаблон совпал. В том, что я удалил, я не увидел ничего, что могло бы вызвать проблему, поэтому я предположил, что проблема связана с длиной строки, и это предположение оказалось правильным. Начиная с PHP 5.2, была реализована новая настройка ini под названием pcre.backtrack_limit.

Документация по этому параметру очень скудна, но в основном она устанавливает верхний предел того, сколько данных обработчик регулярных выражений будет обрабатывать для проверки зависимых символов. Это влияет на такие вещи, как нежадные шаблоны, и я предполагаю, что утверждения упреждающего и обратного просмотра (хотя я не тестировал это). Значение по умолчанию для этого параметра - скудные 100000 байт или 97 КБ. До версии 5.2 этот параметр не существовал, и более длинные шаблоны работали без проблем.

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

Параметр pcre.backtrack_limit можно изменить либо в вашем php.ini, либо во время выполнения. Я установил размер 1 МБ, и у меня не было никаких проблем:

ini_set('pcre.backtrack_limit', '1048576');


Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-