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,使用单反斜杠。