Эта тема на forum.dklab.ru


Maus: как прикинуть длину скомпилированного регулярного выражения?
Со своим словариком наткнулся на неприятный варнинг: мол, длина скомпилированного регулярного выражения слишком велика.
Отсюда вопрос: можно ли хотя бы приблизительно оценить эту длину? Хотя бы в частных случаях?

Конкретно в моем случае паттерн такой '/(?<!\pL)(блок|блок|..)(?!\pL)/ui' , число блоков: 3466, общая длина собранного паттерна 61199 символов (поскольку utf, то байт больше). Метод научного тыка показал, что вчетверо более короткий паттерн уже работает (а вдвое - нет), но хочется формул..
Юрий Насретдинов:
Maus
Тестовый скрипт с различными вариациями ввода:


<?php

$str = 'dfjhkafpiuhafdsihadfsiuads';

for($i = 0; $i < 65536; $i++)
{
if( preg_match('/'.str_repeat('a',$i).'/isuU', $str) === false )
{
echo "\ni = $i\n";
break;
}
}

?>


Этот тестовый скрипт показал, что где-то при количестве символов в 20 000 (русских букв, естесственно) регулярное выражение перестает компилироваться. Собственно, вот тебе и ответ :). Но это не значит, что можно проверять длину в байтах — максимум, что у меня получилось достичь — это 32765 символов = 32765 байт. То есть, до 30 000 байт должно компилироваться любое регулярное выражение, хотя это и не очень быстро будет работать
Maus:
Юрий Насретдинов
спасибо (:
получается, я очень удачно на 15к символов попал :)
не очень быстро будет работать
нуу, все 4 итерации таких длинных регулярок отрабатывают за 0.2 секунды

Эта тема на forum.dklab.ru