PHP使用正则匹配汉字或单字节

下面是utf-8编码的例子:
$str = "MyBB中文站";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {
         print("该字符串全部是中文");
} else {
         print("该字符串不全部是中文");
}

1.  ^[\u2E80-\u9FFF]+$, 这样倒是都通过了, 这个应该就是匹配中日韩文字的正则表达

2. 匹配中文字符的正则表达式: [\u4e00-\u9fa5]

3. preg_match("/瞪/i","康神")了一下,居然匹配了。

下面只匹配汉字(不包含日韩等特殊文字)


1. 提醒一下,\w不能匹配中文

2. 如果要精准匹配中文,即匹配纯中文字符,或匹配中文字符加上全角标点,则需要根据不同编码环境使用不同方法。

下面以两种常用的编码(gb2312,utf-8)进行介绍:
在ANSI(gb2312)环境下,可使用[chr(0xnn)-chr(0xmm)]的方式匹配,
如在一篇网文上就提供这样的方法,”/[".chr(0xb0)."-".chr(0xf7)."]+/”,这是可以使用的,但这太过笼统,这个表达式是匹配全部的gb2312编码表的字符(gb2312编码表http://hi.baidu.com/gaojinshan/blog/item/5a904010327e6609213f2e8d.html),既包括汉字、标点、日文平假名等,还有一些不知是什么符号的。
而从编码表可以看出汉字的编码范围是0xb0a1-0xf7fe,并且gb2312是用两个字节进行编码的,每个字节最高位都是1 。所以可以藉此写出单纯匹配汉字的正则式: "/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])/" ,该表达式能匹配一个中文字符,数量关系就可以容易扩展了。

并且举一反三,如果想匹配全角标点而不匹配中文就可以这样写:
"/([".chr(0xa1)."-".chr(0xa3)."][".chr(0xa1)."-".chr(0xff)."])/",就是匹配编码范围0xa1a1-0xa3ff内的符号。其他的类似。

3. 下面介绍utf-8环境下中文的匹配。
类似于上面,也可以使用unicode编码表(全部编码表,http://hi.baidu.com/lbeny_hit/blog/item/bdb670efade0bffcb2fb95dc.html 。字体编辑用中日韩汉字Unicode编码表,http://www.chi2ko.com/tool/CJK.htm 。)来确定中文的匹配。
由编码表可以看出,中文的编码范围是0x4e00-0x9fa5,于是正则式可以这样写:
"/[\x{4e00}-\x{9fa5}]/u" ,\x{nnnn}表示字符的十六进制形式,更多信息请自己查看php手册。

要特别注意的是模式修正符u ,php手册里这样说:u (PCRE_UTF8) 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。
本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。这正是正确匹配所必须的。其实也想提醒一下,是utf-8环境使用元字符匹配字符串最好加上修正符u,这只是经验。

下面给两个例子:
(1) ANSI编程环境下:
$strtest = “yyg中文字符yyg”;
$pregstr = "/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])+/i";
if(preg_match($pregstr,$strtest,$matchArray)){
    echo $matchArray[0];
}
//output:中文字符

(2) Utf-8编程环境下:
$strtest = “yyg中文字符yyg”;
$pregstr = "/[\x{4e00}-\x{9fa5}]+/u"; if(preg_match($pregstr,$strtest,$matchArray)){
     echo $matchArray[0];
}
//output:中文字符

300*300
  • 没有相关文章
  • 没有评论
 文章首页关于迷茫时代关于我写意人生
版权所有:迷茫时代 All rights reserved   
执行时间:0.00557 秒