Opened 6 months ago
Closed 5 months ago
#431 closed улучшение (готово)
Добавить поддержку PCRE2
Reported by: | alx | Owned by: | alx |
---|---|---|---|
Priority: | средний | Milestone: | 1 очередь |
Component: | any | Keywords: | |
Cc: | san |
Description
В настоящее время регулярные выражения, используемые в различных конфигурационных параметрах (в канальных окончаниях, маршрутах SIP и т.п.) используют синтаксис PCRE и, соответственно, реализованы (выполняются) библиотекой libpcre, развитие которой прекращено в 21 году...
Предлагается перейти на использование регулярных выражений PCRE2 (и, соотетственно, библиотеку libpcre2).
Широко используемая реализация языка PHP, насколько я знаю, перешла на PCRE2 начиная с версии 7.3, вышедшей еще в 18-м году...
Кроме аргумента прекращения развития libpcre, у PCRE2 есть собственные преимущества, ее синтаксис имеет новые возможности (например условная подстановка), которых не было в PCRE, и которые могут в некоторых случаях сильно упростить конфигурацию.
Когда-то я уже пробовал собрать libpcre2 для VE-01, но что-то не пошло. Теперь же выяснилось, что актуальная версия (10.43) библиотеки собирается без проблем.
Change History (6)
follow-up: 2 comment:1 by , 6 months ago
follow-up: 4 comment:2 by , 6 months ago
Replying to alx:
Я не против, главное чтобы не пострадали пользователи. Если пользователь зальёт в плату свой старый конфиг с рег.выражениями PCRE, то и флаг должен быть установлен в положение PCRE.
Может быть имеет смысл рядом с полями ввода рег.выражения выводить какую-то подсказку PCRE или PCRE2 ...
Я предполагаю сделать даже еще более гибко.
Так как PCRE2 имеет не полную обратную совместимость с PCRE (см. например эту статью), кроме того, в PCRE2 другой синтаксис ссылок на группы захвата при подстановках - доллар ($
) вместо бэкслэша (\
) - придется сохранять возможность выполнения регулярных выражений библиотекой libpcre (то есть иметь обе эти библиотеки сразу).
Так как несовместимости с синтаксисом PCRE, насколько я понял из прочитанных статей, минимальны, я не хочу требовать от пользователя вручную включать использование PCRE2. Я хочу сделать не два, а три режима выполнения:
- "авто" (это будет режим по умолчанию);
- "PCRE" (то есть всегда только PCRE);
- "PCRE2" (всегда только PCRE2).
В режиме "авто" предполагаю выбирать движок по следующему алгоритму:
- если рег. выражение не компилируется PCRE2 (то есть любая ошибка компиляции) - использовать PCRE;
- если используется выражение с заменой, то в строке замены ищутся ссылки со "старым" синтаксисом (
\1
,\23
и т.п.), если такие найдены - использовать PCRE. - Попробовать выполнить матчинг с заменой для некоего произвольного текста. Если возникла ошибка (например ссылка
$n
на несуществующую в рег. выражении группу), использовать PCRE; - наконец, если ничего из перечисленного выше не обнаружено, использовать PCRE2.
В libpcre2 (и c++ враппере для нее jpcre2), насколько я мог увидеть, лучше сделана диагностика (легко можно получить ошибку с указанием конкетного места ее обнаружения). Поэтому я также хочу добавить контроль синтаксиса на этапе конфигурирования (где это возможно). То есть вводит, например, пользователь в веб-интерфейсе рег. выражение в строку ввода, введенный текст сразу отправляется на сервер (типа как при автодополнении ввода), там проверяется библиотекой, и в случае обнаружения ошибки место ошибки подсвечивается красным, а сообщение об ошибке показывается где-нибудь рядом в пузыре (или при наведении курсора на строку с ошибкой). В идеале было бы сделать так, как в regex101.com - там место ошибки сразу выделяется красным, но я не знаю, как там реализовано... Если включен режим "авто", и вражение дает ошибку в PCRE2, но в PCRE ошибки нет (например строка замены с \2
), выделить ошибку не красным, а желтым, указав таким образом, что выражение имеет старый синтаксис, который хорошо бы поправить...
Остается только опробовать все это на практике...
Кстати, странно, что на regex101.com в режие PCRE в строке подстановки одинаково работают как ссылки вида \1
, так и ссылки вида $1
, а в VE-01 ссылки вида $1
в подстановках не работают. Может там флаг какой-то есть?...
comment:3 by , 6 months ago
Остается только опробовать все это на практике...
Да, идеи реализации мне нравятся, надо пробовать.
comment:4 by , 6 months ago
Replying to alx:
- Попробовать выполнить матчинг с заменой для некоего произвольного текста. Если возникла ошибка (например ссылка
$n
на несуществующую в рег. выражении группу)
Как показали эксперименты, ссылки на несуществующие группы не приводят к ошибке. Таким образом, не вижу смысла в такой проверке...
Перенесено из комментария san:
Я не против, главное чтобы не пострадали пользователи. Если пользователь зальёт в плату свой старый конфиг с рег.выражениями PCRE, то и флаг должен быть установлен в положение PCRE.
Может быть имеет смысл рядом с полями ввода рег.выражения выводить какую-то подсказку PCRE или PCRE2 ...