免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4886 | 回复: 0
打印 上一主题 下一主题

php中utf-8编码和GB2312编码下用正则表达式如何匹配汉字 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-10 11:03 |只看该作者 |倒序浏览
在网上找了很久.......
-------------------------------------------------------------------------------------------------------------------
在javascript中,要判断字符串是中文是很简单的。比如:
var str = "php编程";
if (/^[\u4e00-\u9fa5]+$/.test(str)) {
alert("该字符串全部是中文");
} else {
alert("该字符串不全部是中文");
}
想当然的,在php中来判断字符串是否为中文,就会沿袭这个思路:
不过,很快就会发现,php并不支持这样的表达,报错:
Warning:  preg_match() [
function.preg-match
]: Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at offset 3 in test.php on line 3
刚开始从google上查了很多次,想从php正则表达式对于十六进制数据的表达方式上进行突破,发现在php中,是用\x表示十六进制数据的。于是,变换成如下的代码:
$str = "php编程";
if (preg_match("/^[\x4e00-\x9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
貌似不报错了,判断的结果也正确,不过把$str换成“编程”两字,结果却还是显示“该字符串不全部是中文”,看来这样的判断还是不够准确。
后来跑回百度搜“
php 匹配汉字 utf 8
”,发现文章的匹配程度竟然要比google的高多了,看来百度的“百度更懂中文”还在一定程度上是正确的。在第二篇文章《
★★★ 求UTF8下匹配汉字的正则, 在线等.........
》中看到了如下的一些内容:
楼主zhiin(┈ Jcan ┈)2006-11-15 15:59:30 在 Web 开发 / PHP 提问
求UTF8下匹配汉字的正则,        不包括全角字符及特殊符号!  
        
网上只能找到匹配全角字符的正则:        ^[\x80-\xff]*^/         
[\u4e00-\u9fa5]可以匹配中文,但是PHP又不支持         
        
郁闷中.......
1 楼PleaseDoTellMeWhy(Allah bless you!)回复于 2006-11-15 16:04:55 得分 11
chr(0xa1)        .        '-'        .        chr(0xff)可以匹配所有中文,但是不知道在UTF-8下如何!Top
2 楼zhiin(┈ Jcan ┈)回复于 2006-11-15 16:11:34 得分 0
即使在gb2312下,        chr(0xa1)        .        '-'        .        chr(0xff)        也不对  
它把全角符号也匹配进来了Top
3 楼xuzuning(唠叨)回复于 2006-11-15 16:19:56 得分 90
模式修正符:        u        
按照这几位提供的线索逐个试了一下,发现还真的如他们所说,可能还跟编码有关系,因此需要了解一下模式修正符的相关知识——于是继续搜索百度。
在一篇《
模式修正符
》的文章中了解到:
u (PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。
例子:
preg_match('/[\x{2460}-\x{2468}]/u', $str);       匹配 内码汉字
按照他提供的方式进行测试,代码如下:$str = "php编程";
if (preg_match("/^[\x{2460}-\x{2468}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
发现这次依然对是否为中文判断失常。不过,既然\x表示的十六进制数据,为什么和js里边提供的范围\x4e00-\x9fa5不一样呢?于是我就换成了下边的代码:
$str = "php编程";
if (preg_match("/^[\x4e00-\x9fa5]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
本来以为铁定成功了的事情,没想到,warning又一次产生了:
Warning:  preg_match() [
function.preg-match
]: Compilation failed: invalid UTF-8 string at offset 6 in test.php on line 3
看来又有错误的表达方式了,于是对照了一下那篇文章的表达方式,给“4e00”和“9fa5”两边分别用"{"和“}”包起来,跑了一遍,发现真的准确了:
$str = "php编程";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——[color="#ff0000"]/^[\x{4e00}-\x{9fa5}]+$/u,于是我又用这个表达式去百度
搜索
,发现竟然还真有别人得出过这样正确的结论,只不过通过常规的方式很难找到而已,而且仅仅搜到有一篇——《
用正则删除汉字
》,看来互联网上对于信息的正确性的筛选还是亟待加强的。
ps:对google不死心,也
搜索
了一下,又发现了一篇文章《
php常用类
》,还是在百度空间的,呵呵,有意思!
----------------------------------------------------------------------------------------------------------------------------------
参考以上文章写了如下一段测试代码(复制以下代码保存成.php文件)
您输入的[".$str."]含有违法字符";     
      }
      else
      {
            echo "您输入的[".$str."]完全合法,通过!";     
      }
}
?>
输入字符(数字,字母,汉字,下划线):
      
      
[color="#ff6600"]推荐阅读:
浴室里的青苔
藏在壁橱里的床
机场行李锁系统
全球首款便携蓝光播放器
盲人手表
带量杯的菜板
USB安全套
晟碟(SanDisk)推出带备份功能的U盘
机器人造型储蓄罐
煎蛋T恤
挂挡水龙头
超小自行车
折叠梯
天下第一奇毒含笑半步癫上市了
气囊警示牌
餐巾纸日历
心形露背装
硬盘也会闹情绪
720P便携高清闪存摄像机
环保地球仪
三星6.5毫米液晶电视
停转的手表
会发短信的洗衣机
车座锁
举重调料瓶
靠柠檬发电的电子钟
7x7x7魔方,挑战脑极限 视频
虚拟纽约再进化!
新科技,让你在家学习滑雪!
S60第五版的BT下载软件
A+网

书签

地图
新鲜
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/78410/showart_1786330.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP