PHP:UTF8中的西里尔字符串的不区分大小写的preg_replace

Ale*_*ber 4 php utf-8 preg-replace internationalization

我有一个PHP 5.3脚本显示我的网站的用户,并希望用它的旧名称替换某个俄罗斯城市(存储在PostgreSQL 8.4.7数据库中的UTF8 + CentOS 5.5/64位Linux)(这是一个内幕笑话) :

preg_replace('/?????????/iu', '??????????', $city);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仅适用于完全匹配:Волгоград.

这不适用于其他情况,如ВОЛГОГРАДволгоград.

如果我将源代码修改为

preg_replace('/[??]????????/iu', '??????????', $city);
Run Code Online (Sandbox Code Playgroud)

然后它将赶上上面的第二个案例.

有谁知道它发生了什么以及如何解决它(假设我不想为每个字母写[Xx])?

谢谢!亚历克斯

更新:

# rpm -qa|grep php
php53-bcmath-5.3.3-1.el5
php53-gd-5.3.3-1.el5
php53-common-5.3.3-1.el5
php53-pdo-5.3.3-1.el5
php53-mbstring-5.3.3-1.el5
php53-xml-5.3.3-1.el5
php53-5.3.3-1.el5
php53-cli-5.3.3-1.el5
php53-pgsql-5.3.3-1.el5

# rpm -qa|grep pcre
pcre-6.6-2.el5_1.7
Run Code Online (Sandbox Code Playgroud)

Ste*_*rig 5

我无法使用PHP 5.3.3(PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli))重现您的问题:

$str1 = '?????????';
$str2 = '?????????';
$str3 = '?????????';

var_dump(preg_replace('/?????????/iu', '??????????', $str1));
var_dump(preg_replace('/?????????/iu', '??????????', $str2));
var_dump(preg_replace('/?????????/iu', '??????????', $str3));
Run Code Online (Sandbox Code Playgroud)

输出

string(20) "??????????"
string(20) "??????????"
string(20) "??????????"
Run Code Online (Sandbox Code Playgroud)

您的PHP使用哪个PCRE版本?检查你phpinfo()的部分pcre.这是我系统上的那个:

...
pcre

PCRE (Perl Compatible Regular Expressions) Support => enabled
PCRE Library Version => 8.02 2010-03-19
...
Run Code Online (Sandbox Code Playgroud)