php 仅在具有特定日语字符的 IIS 上preg_match_all不同的结果


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