php正则统配,完美匹配中⽂的Php正则表达式
完善匹配中⽂的Php正则表达式
1. 笼统的使⽤元字符匹配中⽂,/.*?/s,可匹配⼀段中⽂,这在ANSI(gb2312)和utf-8环境的程序代码都可以实现。但提醒⼀下,\w不能匹配中⽂。曾在⼀本《精通正则表达式》(⼈民邮电出版社,沙⾦编著)书上看到可以使⽤\w匹配中⽂,这⾥纠正⼀下⽤php不⾏。可以使⽤”/./”,” /[^\d]/”,”/[^a]/”,匹配中⽂字符。
2. 如果要精准匹配中⽂,即匹配纯中⽂字符,或匹配中⽂字符加上全⾓标点,则需要根据不同编码环境使⽤不同⽅法。下⾯以两种常⽤的编码(gb2312,utf-8)进⾏介绍:
在 ANSI(gb2312)环境下,可使⽤[chr(0xnn)-chr(0xmm)]的⽅式匹配,如在⼀篇⽹⽂上就提供这样的⽅法,”/[".chr(0xb0)."-
".chr(0xf7)."]+/”,这是可以使⽤的,但这太过笼统,这个表达式是匹配全部的gb2312编码表的字符,既包括汉字、标点、⽇⽂平假名等,还有⼀些不知是什么符号的。⽽从编码表可以看出汉字的编码范围是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编码表来确定中⽂的匹配。由编码表可以看出,中⽂的编码范围是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";
php编程手册if(preg_match($pregstr,$strtest,$matchArray)){
echo $matchArray[0];
}
//output:中⽂字符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论