正则表达式匹配汉字:php中utf-8编码下用正则表达式如何匹配汉字

在javascript中要判断串是中文是很简单比如:
复制代码 代码如下:

var str = "php编程";
(/^[\u4e00-\u9fa5]+$/.test(str)) {
alert("该串全部是中文");
} {
alert("该串不全部是中文");
}


想当然在php中来判断串是否为中文就会沿袭这个思路:
复制代码 代码如下:

<?php
$str = "php编程";
(preg_match("/^[\u4e00-\u9fa5]+$/",$str)) {
pr("该串全部是中文");
} {
pr("该串不全部是中文");
}
?>


不过很快就会发现php并不支持这样表达报错:
Warning: preg_match [function.preg-match]: Compilation failed: PCRE does not support \L, \l, \N, \U, or \u at off 3 in test.php _disibledevent=>正则表达式对于十 6进制数据表达方式上进行突破发现在php中是用\x表示十 6进制数据于是变换成如下代码:
$str = "php编程";
(preg_match("/^[\x4e00-\x9fa5]+$/",$str)) {
pr("该串全部是中文");
} {
pr("该串不全部是中文");
}
貌似不报错了判断结果也正确不过把$str换成“编程”两字结果却还是显示“该串不全部是中文”看来这样判断还是不够准确
后来跑回百度搜“php 匹配汉字 utf 8”发现文章匹配程度竟然要比google高多了看来百度“百度更懂中文”还在定程度上是正确在第 2篇文章★★★ 求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编程";
(preg_match("/^[\x{2460}-\x{2468}]+$/u",$str)) {
pr("该串全部是中文");
} {
pr("该串不全部是中文");
}


发现这次依然对是否为中文判断失常不过既然\x表示十 6进制数据为什么和js里边提供范围\x4e00-\x9fa5不样呢?于是我就换成了下边代码:
复制代码 代码如下:

$str = "php编程";
(preg_match("/^[\x4e00-\x9fa5]+$/u",$str)) {
pr("该串全部是中文");
} {
pr("该串不全部是中文");
}


本来以为铁定成功了事情没想到warning又次产生了:
Warning: preg_match [function.preg-match]: Compilation failed: invalid UTF-8 at off 6 in test.php _disibledevent=>复制代码 代码如下:

$str = "php编程";
(preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {
pr("该串全部是中文");
} {
pr("该串不全部是中文");
}


知道了php中utf-8编码下用正则表达式匹配汉字最终正确表达式——/^[\x{4e00}-\x{9fa5}]+$/u于是我又用这个表达式去百度搜索发现竟然还真有别人得出过这样正确结论只不过通过常规方式很难找到而已而且仅仅搜到有篇——用正则删除汉字看来互联网上对于信息正确性筛选还是亟待加强
ps:对google不死心也搜索了又发现了篇文章php常用类还是在百度空间呵呵有意思!
Tags:  正则表达式汉字 正则表达式不匹配 正则表达式匹配 正则表达式匹配汉字

延伸阅读

最新评论

发表评论