Opened 7 months ago

Closed 6 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)

comment:1 by alx, 7 months ago

Перенесено из комментария san:

Считаю, что надо применить PCRE2 везде (опционально - планирую добавить глобальный флаг, переключающий между PCRE и PCRE2)

Я не против, главное чтобы не пострадали пользователи. Если пользователь зальёт в плату свой старый конфиг с рег.выражениями PCRE, то и флаг должен быть установлен в положение PCRE.
Может быть имеет смысл рядом с полями ввода рег.выражения выводить какую-то подсказку PCRE или PCRE2 ...

in reply to:  1 ; comment:2 by alx, 7 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 san, 7 months ago

Остается только опробовать все это на практике...

Да, идеи реализации мне нравятся, надо пробовать.

in reply to:  2 comment:4 by alx, 7 months ago

Replying to alx:

  • Попробовать выполнить матчинг с заменой для некоего произвольного текста. Если возникла ошибка (например ссылка $n на несуществующую в рег. выражении группу)

Как показали эксперименты, ссылки на несуществующие группы не приводят к ошибке. Таким образом, не вижу смысла в такой проверке...

comment:5 by alx, 6 months ago

Изменения в коде сделаны.
Приступаю к завершающему тестированию.

comment:6 by alx, 6 months ago

Resolution: готово
Status: newclosed

Реализовано в r2338...r2361.

Note: See TracTickets for help on using tickets.