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)
我无法使用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)
| 归档时间: |
|
| 查看次数: |
9985 次 |
| 最近记录: |