检测是否在没有--enable-unicode-properties或--enable-utf8配置开关的情况下构建PCRE

时间:2010-12-22 13:21:10

标签: php utf-8 pcre

我有一个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支持。

2 个答案:

答案 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公开。我唯一可以想象的是运行一个简单的正则表达式,并发出警告......