我们有一个问题,即函数根据我们运行它的服务器给出不同的结果。
函数如下:
<?php
$s='校';
preg_match_all( '/".*?("|$)|((?<=[''s",+])|^)[^''s",+]+/', $s, $matches );
结果因环境而异:
WAMP (PHP 5.5.12 PCRE 8.34)和
LAMP (php 5.3.3 PCRE 7.8) 环境都给出相同的结果
array (size=3)
0 =>
array (size=1)
0 => string '校' (length=3)
1 =>
array (size=1)
0 => string '' (length=0)
2 =>
array (size=1)
0 => string '' (length=0)
WS2008 IIS7 (php 5.4.24 PCRE 8.32)
array(3) {
[0]=> array(2) {
[0]=> string(1) "�"
[1]=> string(1) "�"
}
[1]=> array(2) {
[0]=> string(0) ""
[1]=> string(0) ""
}
[2]=> array(2) {
[0]=> string(0) ""
[1]=> string(0) ""
}
}
现在,真正奇怪的是,对于许多不同的日语字符,结果在所有环境中都是正确的。现在我们唯一能重现这个问题的时候就是这个"校"字。无论是伴随(例如$s='校正')还是单独使用,IIS上的结果总是不同的,看起来像编码问题''。
我首先尝试研究 php 版本和 PCRE 版本,但两者都是我们 LAMP 上的旧版本,所以我认为问题可能出在其他地方......
问候
在处理 Unicode 字符串时,您需要将 /u
修饰符与模式一起传递。
用
'/".*?("|$)|((?<=['s",+])|^)[^'s",+]+/u'.
另外,您应该注意,在单个引号文本中,您不需要将双反斜杠与 ''s
一起使用,使用单个反斜杠。