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

Mar*_*ker 13 php pcre utf-8

我有一个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启用了支持.

net*_*der 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
Run Code Online (Sandbox Code Playgroud)

  • 不会有帮助,因为 PCRE 与 PHP 捆绑在一起(因此可以使用与服务器上安装的不同的编译 - 如果它安装在服务器上)...例如,在我的一个系统上 PCRE 是版本 6.6,但是 PHP 的PCRE版本是8.02... (4认同)
  • 遗憾的是,PHP 可以使用自己的 PCRE,或者来自服务器的 PCRE,具体取决于它的构建方式。 (2认同)