我有一个PHP库,它使用多个正则表达式,其中包含多字节字符串的\P
表达式,例如。
((((?:\P{M}\p{M}*)+?)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)
虽然这适用于大多数版本,但我有一些关于正则表达式返回错误的报告。
根据操作平台,PCRE的错误消息为:
编译失败:PCRE在偏移量n不支持\ L,\ l,\ N,\ P,\ p,\ U,\ u或\ X
或
编译失败:尚未在偏移量n
编译对\ P,\ p和\ X的支持
我知道我可以在我的代码开头使用\P
测试正则表达式,并捕获返回的错误,然后使用该响应设置兼容性标志并提供降级(非UTF- 8)基于该兼容性标志,在我的代码主体内没有\P
的正则表达式。
我想知道是否有更简单的方法来确定是否在没有--enable-unicode-properties
或--enable-utf8
配置开关的情况下构建了PCRE。 PHP提供PCRE_VERSION
常量的访问权限,但无法确定是否启用了\P
支持。
答案 0 :(得分:3)
除了尝试之外,我认为唯一的方法是使用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 :(得分:1)
虽然评论建议检查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公开。我唯一可以想象的是运行一个简单的正则表达式,并发出警告......