Подтвердить что ты не робот

Обнаружение, если PCRE был создан без параметров --enable-unicode или -enable-utf8

У меня есть библиотека PHP, которая использует ряд регулярных выражений с выражениями \P для многобайтовых строк, например.

((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)

В то время как это работает для большинства построений, у меня появилось несколько сообщений о том, что regexp возвращает ошибку.

В зависимости от операционной платформы сообщения об ошибках от PCRE:

Ошибка компиляции: PCRE не поддерживает \L,\l,\N,\P,\p,\U,\u или\X при смещении n

или

Ошибка компиляции: поддержка \P,\p и\X не была скомпилирована со смещением n

Я знаю, что, возможно, я могу проверить regexp в начале моего кода, который использует \P, и ловушку для возвращаемой ошибки, затем использовать этот ответ для установки флага совместимости и предоставления деградированного (не UTF-8) regexp без \P в основной части моего кода на основе этого флага совместимости.

Мне было интересно, был ли более простой способ определить, был ли PCRE создан без коммутаторов конфигурации --enable-unicode-properties или --enable-utf8. PHP предоставляет доступ к константе PCRE_VERSION, но это не поможет определить, включена ли поддержка \P или нет.

4b9b3361

Ответ 1

Иначе, чем пытаться, я думаю, что единственный способ - использовать инструмент командной строки pcretest с опцией -C (параметры времени компиляции):

bash-4.1.5$ pcretest -C
   No UTF-8 support
   No Unicode properties support
   Newline sequence is LF
   \R matches all Unicode newlines
   Internal link size = 2
   POSIX malloc threshold = 10
   Default match limit = 10000000
   Default recursion depth limit = 10000000
   Match recursion uses stack

Ответ 2

В комментариях предлагается проверить PREG_BAD_UTF8_ERROR источник PHP http://lxr.php.net/xref/PHP_5_6/ext/pcre/php_pcre.c#141. Эта константа всегда доступна, если PCRE. В самом деле, кажется, что --enable-unicode-properties - это переключатель PCRE lib и просто не отображается PHP. Единственное, что я могу себе представить, это запустить простое регулярное выражение один раз с предупреждением, подавленным...