preg_match имеет предел str на PHP 5.2.5
<?php $str1 = 'a@b%c@d' . str_repeat ('=', 33326); $str2 = 'a@b%c@d' . str_repeat ('=', 33327); $regexp = '/^(.*)@(.*)%(.*)$/si'; echo preg_match ($regexp, $str1) ? "Correct " : "Wrong "; // works correctly echo "\n"; echo preg_match ($regexp, $str2) ? "Correct " : "Wrong "; // exhibits the bug echo "\n";
preg_last_error () после второго вызова возвращает 2 (= PREG_BACKTRACK_LIMIT_ERROR), поэтому вы можете поднять это значение.