我有一个PHP库,它使用了许多带有\P多字节字符串表达式的正则表达式,例如
((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)
Run Code Online (Sandbox Code Playgroud)
虽然这适用于大多数版本,但我有一些regexp返回错误的报告.
根据操作平台,PCRE的错误消息是:
编译失败:PCRE在偏移量n处不支持\ L,\ l,\ N,\ P,\ p,\ U,\ u或\ X
要么
编译失败:尚未在偏移量n处编译对\ P,\ p和\ X的支持
我知道我可以在我的代码的开头测试一个正则表达式,它使用\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
Run Code Online (Sandbox Code Playgroud)