Как стать автором
Обновить

Тест PHP-функции preg_match

Время на прочтение1 мин
Количество просмотров16K
Если PHP-функции preg_match в качестве исходной строки передать строку состоящую из 100000 (ста тысяч) или более силволов, то она вернёт неверный результат. Точнее результатом в этом случае всегда будет false.

Проверяется очень просто.
$max_n=100010;
$n=99900;
$tmp_str=str_repeat('b',$n);
$go=true;
while (($go)&&($n<=$max_n)) {
$n++;
$tmp_str.='b';
$str='a'.$tmp_str.'a';
$go=preg_match('/a.*?a/sim', $str);
if (!$go) {
echo 'error on length '.strlen($str);
die;
}
}
echo ' ok';

Результатом работы данного скрипта будет такое сообщение
error on length 100000

Что говорит о том, что preg_match не осилил строку длинной сто тысяч символов. При более длинных строках результат будет тот же. Хотя мне не до конца понятно почему функция спотыкается именно на строке длинной в 100000 байт. Видимо это особенность реализации.

Проверял на PHP Version 5.2.6-1.

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

Всё выше сказанное также справедливо и для PHP-функции preg_match_all.

UPD Решение проблемы из коментария l2k
ini_set(«pcre.backtrack_limit»,10000000);
Таким образом можно изменить лимит обратных ссылок PCRE.
Причём изменяемость директивы PHP_INI_ALL, что означает что она может быть установлена в любом месте.
Теги:
Хабы:
Всего голосов 59: ↑41 и ↓18+23
Комментарии42

Публикации

Истории

Работа

PHP программист
76 вакансий

Ближайшие события

4 – 5 апреля
Геймтон «DatsCity»
Онлайн
8 апреля
Конференция TEAMLY WORK MANAGEMENT 2025
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область