8 和 gb2312的正则区别

在ANSI(gb2312)情况下
匹配全部的gb2312编码表的字符:/[".chr(0xb0)."-".chr(0xf7)."]+/
纯真匹配汉字而不匹配全角标点:/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])/
该表达式能匹配一其中文字符。
匹配全角标点而不匹配汉字:/([".chr(0xa1)."-".chr(0xa3)."][".chr(0xa1)."-".chr(0xff)."])/
utf-8情况下中文的匹配
汉字编码范畴是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,这只是履历。

这段时间试图利用php正则表达式(Perl 兼容正则表达式函数)处理惩罚中文文本信息,在匹配中文上碰着诸多问题,求助于网上的参考资料,然网文 多良莠不齐,并存在诸多谬误,颠末几天的摸索和测试,终于总结出了几种可用方法的,写下供有乐趣者参考,为纷繁巨大的网文又增加一篇。


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编码表。字体编辑用中日韩汉字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"; if(preg_match($pregstr,$strtest,$matchArray)){     echo $matchArray[0]; } //output:中 文字符

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7983.html