PHP:UTF8中的西里尔字符串不区分大小写的preg_replace
|
我有一个PHP 5.3脚本显示我的网站用户,并想用它的旧名称替换某个俄罗斯城市(存储在PostgreSQL 8.4.7数据库中的UTF8 + CentOS 5.5 / 64位Linux中)(这是一个内部笑话) :
preg_replace(\'/Волгоград/iu\', \'Сталинград\', $city);
不幸的是,这仅适用于完全匹配:Волгоград。
这不适用于其他情况,例如ВОЛГОГРАД或волгоград。
如果我将源代码修改为
preg_replace(\'/[Вв]олгоград/iu\', \'Сталинград\', $city);
那么它将捕获上述第二种情况。
是否有人知道它发生了什么以及如何解决(假设我不想为每个字母写[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
没有找到相关结果
已邀请:
9 个回复
嘘崇蔡对
)重现您的问题:
输出
您的PHP使用哪个PCRE版本?在
部分检查
。那就是我系统上的那个:
扦帽次杏
输出量
这引起了我的兴趣,所以我问了一个问题。
徐百晴墓斜
寇剩
。确实是
,而不是普通的拉丁语
。但是,由于它们看起来非常相似:
,我相信俄语字母会被整理到B16ѭ的拉丁字母B上。 因此,要么是PHP对其进行预格式化,要么PCRE在那里也不精确。测试您的
并查看更新日志。 无论如何,为了避免这个问题,我建议您只使用小写字母。它们更有可能与拉丁字母不同。
附言:恶作剧!
蓟类
输出:
您确定输入数据($ city)在UTF8中吗?
翁茄口霉氖
丧泉缝锋
妒垮
上面的示例将成功(用大小写替代)\'гъз\'替换为YYYYYY,并返回UTF-8版本。 问候!
才改隘瘁
虽然您可以重写regexp以使用一些utf技巧,将代码转换为utf,但是当您使用庞大的代码库/数据库等时,这不是一个选择