喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
 21  1/3  1  2  3  > 
     
标题: php中文汉字替换与模式匹配的问题!!请大家必看!  
 
bluedoor (bluedoor)
中级会员
Rank: 3Rank: 3
老会员



UID 18516
精华 1
积分 439
帖子 407
金钱 429 喜悦币
威望 10
人脉 0
阅读权限 30
注册 2003-2-23
状态 离线
php中文汉字替换与模式匹配的问题!!请大家必看!

  原帖地址:http://www.anbbs.com/anbbs/index.php?f_id=3&page=1
  这两天正在做一个关键字加亮显示的程序,写好的程序在本地测试也跑得好好的,可是一上去页面就出现一堆一堆的乱码,别说加亮了,简直就是没的看!

  我就找错误,找来找去,发现英文没有问题,遇到汉字容易出问题,有的时候遇到汉字必出问题。

  总结一下:

  当使用模式匹配的时候,如:preg_match_all($pat,……)与preg_replace($pat,……)……

  容易出问题的情况如下:
  preg_match_all("/(汉字)+/ism","我是汉字,看你把我怎么着!",$m_a);
  这个模式很简单就是匹配出“汉字”。这种情况模式中包含汉字可以成功匹配出来,但是也不要高兴得太早,结果不确定,为什么不确定你慢慢往下看。

  必出现问题情况如下:
  preg_match_all("/[汉字]+/ism","我是汉字,看你把我怎么着!",$m_a);
  本想匹配出现“汉”、“字”或者“汉字”。这个必出现问题,匹配的结果一大群乱码,没准还会出个死循环呢。为什么会出现这种情况?是因为PHP内部使用不是UNICODE,不支持多字节文字,所以一个"汉字"就被当成4bytes的ASCII去进行模式匹配,不出错才怪呢!

  后来我又试试重新写一下模式匹配,发现一种似乎(为什么说似乎?往后看)方法可以解决:
  preg_match_all("/(汉|字)+/ism","我是汉字,看你把我怎么着!",$m_a);

  这样写可以匹配出“汉”、“字”或者“汉字”,$m_a中的结果

Array
(
    [0] => Array
        (
            [0] => 汉字
        )

    [1] => Array
        (
            [0] => 字
        )

)

  怎么样全匹配的字符串出现了吧!可是高兴得太早了,后来在实际中用还是会经常出问题!再去找问题,终于找到问题的根了!PHP不支持多字节文字,所以在进行模式匹配与字符操作的时候都是内码转化后进行的(我不知道这样说对不对),举个实例吧:

  eregi_replace("性","没有" , "有责任感");这个操作就是要把字符串"有责任感"中"性"字替换成"没有",最后的结果是什么?因为"有责任感"中没有"性"就个字,结果应该是没有执行替换操作返回"有责任感",可是结果竟然是"用挥叙任感"!

  没想到吧!为什么?看一下ASCII码你就明白了,2个ASCII码代码一个汉字"有责任感"的ASCII编码依次为:211,208(有),212,240(责),200,206(任),184,208(感) 

  而"性"的编码为:208,212(性),恰好与有的第2字节和责的第1字节组合是一致的!所以PHP就认识找到相同的模式进行匹配,拆成一半的汉字再与替换后的字串进行组合,所以就出错了!

  当时我想最常用的str_replace(),应该不会有问题的,但是事实上str_replace()执行同样的操作也会出错!现在我想以前进行汉字替换实在是太幸运了!可能是那个时候进行的汉字替换都是比较长的汉字串吧,不太容易出现以上的情况。即使没有出问题,也要知道那是不安全的!

  问题是有的,工作还要继续做,克服的困难也就::::现在的自我了。

  好在想起一组PHP的扩展模块,Multibyte String Functions,添加许多支持多字节文字的操作的函数,如:ereg_replace() 对应着mb_ereg_replace() 等等。具体的函数说明请查询相关的文章。

  总结:对于中文汉字安全的操作最好是使用Multibyte String Functions。
2005-3-23 05:28 PM#1
查看资料  访问主页  发短消息  顶部
 
bluedoor (bluedoor)
中级会员
Rank: 3Rank: 3
老会员



UID 18516
精华 1
积分 439
帖子 407
金钱 429 喜悦币
威望 10
人脉 0
阅读权限 30
注册 2003-2-23
状态 离线
[推荐阅读] 今天下载了Zend Studio 4.0 BETA,熟悉这个软件的朋友进来下,有问题,谢谢!
唉,自己顶一下,什么年代,自己写的东西还要求别人来看!
2005-3-25 05:54 PM#2
查看资料  访问主页  发短消息  顶部
 
太阳雨
高级会员
Rank: 4
船长



UID 29985
精华 0
积分 727
帖子 876
金钱 727 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2004-7-10
来自 广州
状态 离线
[推荐阅读] 无语....用过51.net 的朋友进来一下
看开点吧!没办法了,人家没碰到就不会珍惜前人的经验的,我以前也碰到过,我当时是转为utf-8再操作的



PHPec开发框架(www.phpec.com)
2005-3-25 06:54 PM#3
查看资料  Blog  发短消息  QQ  顶部
 
login6532 (login6532)
高级会员
Rank: 4
资深会员


UID 29567
精华 1
积分 857
帖子 793
金钱 847 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2004-6-23
状态 离线
[推荐阅读] 文件上传路径问题
顶啊!!!收藏
2005-3-25 11:57 PM#4
查看资料  访问主页  发短消息  QQ  顶部
 
yueyang (yueyang)
金牌会员
Rank: 6Rank: 6
高级会员


UID 20841
精华 1
积分 1420
帖子 1388
金钱 1410 喜悦币
威望 10
人脉 0
阅读权限 70
注册 2003-6-17
状态 离线
[推荐阅读] 急求:php页面的默认语言问题
最终还是靠PHP自己解决的,和PB一样.



我在HP官方论坛做版主希望大家能来捧场,论坛有礼品赠送及可兑换礼品.
2005-3-26 09:17 AM#5
查看资料  访问主页  发短消息  顶部
 
dancebear (dancebear)
注册会员
Rank: 2
中级会员



UID 15442
精华 0
积分 114
帖子 121
金钱 114 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2002-7-24
来自 深圳
状态 离线
[推荐阅读] linux 下安装mysql 4.1.9如何设置字符集?
這個問題我也疑惑過很久!多謝指教!~~~~
2005-3-26 09:51 AM#6
查看资料  访问主页  Blog  发短消息  顶部
 
dann (dann)
新手上路
Rank: 1
初级会员



UID 54740
精华 0
积分 9
帖子 9
金钱 9 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2004-11-26
状态 离线
[推荐阅读] 请问建MySQL表时这些键或主键有什么区别?


Multibyte String Functions
php4.3或以上才支持,我的是4.2xx
2005-3-26 12:16 PM#7
查看资料  发短消息  顶部
 
bluedoor (bluedoor)
中级会员
Rank: 3Rank: 3
老会员



UID 18516
精华 1
积分 439
帖子 407
金钱 429 喜悦币
威望 10
人脉 0
阅读权限 30
注册 2003-2-23
状态 离线
[推荐阅读] Mysql查询注册用户信息


QUOTE:
最初由 太阳雨 发布
[B]看开点吧!没办法了,人家没碰到就不会珍惜前人的经验的,我以前也碰到过,我当时是转为utf-8再操作的 [/B]
也是一个非常好的解决方法,我没想到。
能不能给个例子我们继续讨论一下。
2005-3-26 07:16 PM#8
查看资料  访问主页  发短消息  顶部
 
showsa
中级会员
Rank: 3Rank: 3
老会员



UID 29652
精华 0
积分 447
帖子 446
金钱 447 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2004-6-27
状态 离线
[推荐阅读] E路无忧.cn域名价格全面下调,现在注册70元/年!
可不可以 encode以后换呢? 没试过哦

不过UTF-8 应该没问题




上海家教
爱心家教
2005-3-28 02:31 PM#9
查看资料  访问主页  发短消息  顶部
 
shanyi (shanyi)
新手上路
Rank: 1
初级会员



UID 16340
精华 0
积分 17
帖子 15
金钱 17 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2002-9-6
状态 离线
[推荐阅读] 我要票啊,2月4号北京到信阳的
好东西

2005-3-28 04:08 PM#10
查看资料  发短消息  顶部
 21  1/3  1  2  3  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.026284 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP