Определить, был ли PCRE собран без параметров конфигурации --enable-unicode-properties или --enable-utf8 - PullRequest
13 голосов
/ 22 декабря 2010

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

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

Хотя это работает на большинстве сборок, у меня было несколько сообщений о том, что регулярное выражение возвращает ошибку.

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

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

или

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

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

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

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010

Кроме того, я думаю, что единственный способ - использовать инструмент командной строки 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
1 голос
/ 01 февраля 2016

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

...