PHP preg_match length 3276 limit

Похоже, что preg_match PHP имеет ограничение на 3276 символов для сопоставления повторяющихся символов в некоторых случаях.

т.е.

^(.|\s){0,3276}$ работает, но ^(.|\s){0,3277}$ нет.

Кажется, что это не всегда применяется, поскольку /^(.){0,3277}$/ работает.

Я не могу найти это нигде в документации PHP или отладчике ошибок. Число 3276 кажется немного странной границей, единственное, что я могу придумать, это то, что это примерно 1/10 из 32767, что является пределом для подписанного 16-битного целого числа.

preg_last_error() возвращает 0.

Я воспроизвел проблему на http://www.phpliveregex.com/, а также мою локальную систему и веб-сервер.

EDIT: Похоже, мы получаем «Предупреждение: preg_match (): Ошибка компиляции: регулярное выражение слишком велико при смещении на 16 дюймов от кода, поэтому, похоже, это та же проблема, что и предел PHP preg_match_all .

Однако, само регулярное выражение не очень велико … Является ли PHP каким-то расширением, когда вы повторяете группы, которые делают его слишком большим?

Чтобы обрабатывать регулярные выражения, совместимые с Perl, PHP просто связывает стороннюю библиотеку, которая заботится о работе. Поведение, которое вы описываете, фактически документировано :

Коэффициент «*» эквивалентен {0,}, квантору «+» на {1,} и «?» квантификатор до {0,1}. n и m ограничены неотрицательными интегральными значениями, меньшими заданного предела, определяемого при построении perl. Обычно это 32766 на наиболее распространенных платформах.

Так что всегда есть жесткий предел. Почему ваши тесты показывают, что предел PHP в 10 раз меньше обычного? Не знаю об этом 🙂

Попробуйте использовать ^(.|\s){0,3276}(.|\s){0,1}$