PHP正则匹配中文

PHP正则匹配中文

作者:LAMP小白  点击:2434  发布日期:2012-09-20 00:34:00  返回列表

这段时间试图使用php正则表达式(Perl 兼容正则表达式函数)处理中文文本信息,在匹配中文上遇到诸多问题,求助于网上的参考资料,然网文多良莠不齐,并存在诸多谬误,经过几天的探索和测试,终于总结出了几种可用方式的,写下供有兴趣者参考,为纷繁复杂的网文又增加一篇。


1. 笼统的使用元字符匹配中文,/.*?/s,可匹配一段中文,这在ANSI(gb2312)和utf-8环境的程序代码都可以实现。但提醒一下,w不能匹配中文。曾在一本《精通正则表达式》(人民邮电出版社,沙金编著)书上看到可以使用w匹配中文,这里纠正一下用php不行。可以使用”/./”,”/[^d]/”,”/[^a]/”,匹配中文字符。

2. 如果要精准匹配中文,即匹配纯中文字符,或匹配中文字符加上全角标点,则需要根据不同编码环境使用不同方法。下面以两种常用的编码(gb2312,utf-8)进行介绍:

在ANSI(gb2312)环境下,可使用[chr(0xnn)-chr(0xmm)]的方式匹配,如在一篇网文上就提供这样的方法,”/[mio_quot;.chr(0xb0).mio_quot;-mio_quot;.chr(0xf7).mio_quot;]+/”,这是可以使用的,但这太过笼统,这个表达式是匹配全部的gb2312编码表的字符,既包括汉字、标点、日文平假名等,还有一些不知是什么符号的。而从编码表可以看出汉字的编码范围是0xb0a1-0xf7fe,并且gb2312是用两个字节进行编码的,每个字节最高位都是1 。所以可以藉此写出单纯匹配汉字的正则式:

mio_quot;/([mio_quot;.chr(0xb0).mio_quot;-mio_quot;.chr(0xf7).mio_quot;][mio_quot;.chr(0xa1).mio_quot;-mio_quot;.chr(0xfe).mio_quot;])/mio_quot; ,该表达式能匹配一个中文字符,数量关系就可以容易扩展了。

并且举一反三,如果想匹配全角标点而不匹配中文就可以这样写:

mio_quot;/([mio_quot;.chr(0xa1).mio_quot;-mio_quot;.chr(0xa3).mio_quot;][mio_quot;.chr(0xa1).mio_quot;-mio_quot;.chr(0xff).mio_quot;])/mio_quot;,就是匹配编码范围0xa1a1-0xa3ff内的符号。其他的类似。

3. 下面介绍utf-8环境下中文的匹配。类似于上面,也可以使用unicode编码表来确定中文的匹配。由编码表可以看出,中文的编码范围是0x4e00-0x9fa5,于是正则式可以这样写:

mio_quot;/[x{4e00}-x{9fa5}]/umio_quot; ,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 = mio_quot;/([mio_quot;.chr(0xb0).mio_quot;-mio_quot;.chr(0xf7).mio_quot;][mio_quot;.chr(0xa1).mio_quot;-mio_quot;.chr(0xfe).mio_quot;])+/imio_quot;;

if(preg_match($pregstr,$strtest,$matchArray)){

echo $matchArray[0];

}

//output:中文字符

(2) Utf-8编程环境下:

$strtest = “yyg中文字符yyg”;

$pregstr = mio_quot;/[x{4e00}-x{9fa5}]+/umio_quot;;

if(preg_match($pregstr,$strtest,$matchArray)){

echo $matchArray[0];

}

//output:中文字符



上一篇:ON DUPLICATE KEY UPDATE 下一篇:快递查询API
0