У меня есть 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
или нет.