php preg_match_all IIS 上的不同结果仅针对特定的日文字符
php preg_match_all different result on IIS only with specific japanese character
我们遇到一个问题,函数根据我们所在的服务器给出不同的结果运行。
函数如下:
<?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
,使用单反斜杠。
我们遇到一个问题,函数根据我们所在的服务器给出不同的结果运行。
函数如下:
<?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
,使用单反斜杠。