У меня есть библиотека PHP, которая использует ряд регулярных выражений с выражениями \P
для многобайтовых строк, например
((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([az]{1,3})\$?(\d+)
Хотя это работает на большинстве построек, у меня было несколько сообщений о том, что regexp возвращает ошибку.
В зависимости от операционной платформы сообщения об ошибках от PCRE:
Ошибка компиляции: PCRE не поддерживает \ L, \ l, \ N, \ P, \ p, \ U, \ u или \ X при смещении n
или
Ошибка компиляции: поддержка \ P, \ p и \ X не была скомпилирована со смещением n
Я знаю, что, возможно, я могу проверить регулярное выражение в начале моего кода, который использует \P
и ловушку для возвращаемой ошибки, а затем использовать этот ответ для установки флага совместимости и предоставления неопределенного (не UTF-8) регулярного выражения без \P
в основной части моего кода на основе этого флага совместимости.
Мне было интересно, был ли более простой способ определить, был ли PCRE создан без параметров --enable-unicode-properties
или --enable-utf8
. PHP предоставляет доступ к константе PCRE_VERSION
, но это не поможет определить, включена ли поддержка \P
или нет.
Помимо попытки его использования, я думаю, что единственный способ – использовать инструмент командной строки 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
Хотя комментарии предполагают проверку 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. Единственное, что я могу себе представить, – это простое регулярное выражение с предупреждением, подавленным …