Tengo una biblioteca de PHP que usa varias expresiones regulares con las expresiones \P
para cadenas multibyte, p. Ej.Detecta si PCRE se construyó sin los --enable-unicode-properties o --enable-utf8 switches de configuración
((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)
Aunque esto funciona en la mayoría de las compilaciones, he tenido algunos informes de que la expresión regular devuelve un error.
dependiendo de la plataforma de funcionamiento, los mensajes de error de PCRE son:
Compilación falló: PCRE no soporta \ L, \ l, \ N, \ P, \ p, \ T, \ u, o \ X en el offset n
o
Compilación falló: soporte para \ P, \ p, y \ X no se ha compilado en el desplazamiento n
Sé que probablemente pueda probar una expresión regular al comienzo de mi código que usa \P
, y atrapar un error devuelto, luego usar esa respuesta para establecer una bandera de compatibilidad y proporcionar una expresión regular degradada (no UTF-8) sin el \P
dentro del cuerpo principal de mi código basado en ese indicador de compatibilidad.
Me preguntaba si había alguna manera más simple de identificar si PCRE se había construido sin los conmutadores de configuración --enable-unicode-properties
o --enable-utf8
. PHP proporciona acceso a la constante PCRE_VERSION
, pero eso no ayudará a identificar si la compatibilidad con \P
está habilitada o no.
Me pregunto si 'PREG_BAD_UTF8_OFFSET' se definiría si no compiló con soporte para utf8. Verifique si existe esa constante ('defined ('PREG_BAD_UTF8_OFFSET');') en las plataformas en las que no se compiló. Si no lo tiene, ahí está su cheque. Si lo hace, siempre se puede analizar 'phpinfo()', pero eso no va a ser barato ... – ircmaxell
phpinfo() en realidad no proporciona esa información ... Ya lo he comprobado. Haré una nueva versión de PCRE en uno de mis servidores de prueba y reconstruiré PHP contra eso para ver si PREG_BAD_UTF8_OFFSET está definido, eso proporcionaría una alternativa más limpia a mi repliegue si pudiera simplemente probar una constante definida. –
Bueno, dado que PCRE es compilado por PHP, ¿no debería ser una opción de configuración para PHP? (es decir, ¿no debería aparecer en la línea 'configure' de Phpinfo)? Sin embargo, podría estar equivocado ... – ircmaxell