我有以下正则表达式在我的测试服务器上正常工作,但只是在我的托管服务器上返回一个空字符串。
$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属性而失败?或者还有其他我缺少的东西?
谢谢大家, 暖气。
答案 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就是一个门槛。