Pull to refresh

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

Reading time1 min
Views16K
Если 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, что означает что она может быть установлена в любом месте.
Tags:
Hubs:
Total votes 59: ↑41 and ↓18+23
Comments42

Articles