PHP PCRE在测试和托管服务器上的差异

时间:2010-04-23 17:25:57

标签: php regex unicode pcre

我有以下正则表达式在我的测试服务器上正常工作,但只是在我的托管服务器上返回一个空字符串。

$text = preg_replace('~[^\\pL\d]+~u', $use, $text);

现在我很确定这归结为PCRE的托管服务器版本没有在启用Unicode属性支持的情况下编译。两个版本的差异如下:

我的服务器:

PCRE version 7.8 2008-09-05
Compiled with
UTF-8 support
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

托管服务器:

PCRE version 4.5 01-December-2003
Compiled with
UTF-8 support
Newline character is LF
Internal link size = 2
POSIX malloc threshold = 10
Default match limit = 10000000
Match recursion uses stack

另请注意,托管服务器上的版本(与PHP编译的版本相同)已经过时了。

令我困惑的是,pcretest在命令行中使用

在两台服务器上都失败了
re> ~[^\\pL\d]+~u
** Unknown option 'u'

虽然这个regexp在我的服务器上从PHP运行时工作正常。

所以,我想我的问题是托管服务器上的正则表达式是否因为缺少Unicode属性而失败?或者还有其他我缺少的东西?

谢谢大家, 暖气。

3 个答案:

答案 0 :(得分:2)

最有可能的是,主机服务器上的PCRE未启用UTF8支持。

pcretest使用不同的选项。 UTF-8为'8',而不是'u'。这就是错误的原因。

另请注意,可以在同一台计算机上的Apache或CLI版本的PHP中使用不同的PCRE库。

答案 1 :(得分:2)

PCRE 4.5支持UTF-8但不支持\pL等Unicode属性,并且不支持启用它们的/u标志。您需要将服务器上的PCRE升级到5.0或更高版本。您可能还需要升级PHP以在/u中支持preg_replace()

答案 2 :(得分:0)

回答你的问题;是的,不。我相信当UTF8支持可用时,PCRE 5.0就是一个门槛。