1. 籠統的使用元字符匹配中文,/.*?/s,可匹配一段中文,這在A(yíng)NSI(gb2312)和utf-8環(huán)境的程序代碼都可以實(shí)現。但提醒一下,\w不能匹配中文。曾在一本《精通正則表達式》(人民郵電出版社,沙金編著(zhù))書(shū)上看到可以使用\w匹配中文,這里糾正一下用php不行??梢允褂?#8221;/./”,”/[^\d]/”,”/[^a]/”,匹配中文字符。
2. 如果要精準匹配中文,即匹配純中文字符,或匹配中文字符加上全角標點(diǎn),則需要根據不同編碼環(huán)境使用不同方法。下面以?xún)煞N常用的編碼(gb2312,utf-8)進(jìn)行介紹:
在A(yíng)NSI(gb2312)環(huán)境下,可使用[chr(0xnn)-chr(0xmm)]的方式匹配,如在一篇網(wǎng)文上就提供這樣的方法,”/[".chr(0xb0)."-".chr(0xf7)."]+/”,這是可以使用的,但這太過(guò)籠統,這個(gè)表達式是匹配全部的gb2312編碼表的字符(gb2312編碼表http://hi.baidu.com/gaojinshan/blog/item/5a904010327e6609213f2e8d.html),既包括漢字、標點(diǎn)、日文平假名等,還有一些不知是什么符號的。而從編碼表可以看出漢字的編碼范圍是0xb0a1-0xf7fe,并且gb2312是用兩個(gè)字節進(jìn)行編碼的,每個(gè)字節最高位都是1 。所以可以藉此寫(xiě)出單純匹配漢字的正則式:
"/([".chr(0xb0)."-".chr(0xf7)."][".chr(0xa1)."-".chr(0xfe)."])/" ,該表達式能匹配一個(gè)中文字符,數量關(guān)系就可以容易擴展了。
并且舉一反三,如果想匹配全角標點(diǎn)而不匹配中文就可以這樣寫(xiě):
"/([".chr(0xa1)."-".chr(0xa3)."][".chr(0xa1)."-".chr(0xff)."])/",就是匹配編碼范圍0xa1a1-0xa3ff內的符號。其他的類(lèi)似。
3. 下面介紹utf-8環(huán)境下中文的匹配。類(lèi)似于上面,也可以使用unicode編碼表(全部編碼表,http://hi.baidu.com/lbeny_hit/blog/item/bdb670efade0bffcb2fb95dc.html 。字體編輯用中日韓漢字Unicode編碼表,u (PCRE_UTF8) 此修正符啟用了一個(gè) PCRE 中與 Perl 不兼容的額外功能。模式字符串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開(kāi)始檢查模式的 UTF-8 合法性。這正是正確匹配所必須的。其實(shí)也想提醒一下,是utf-8環(huán)境使用元字符匹配字符串最好加上修正符u,這只是經(jīng)驗。
下面給兩個(gè)例子:
(1) ANSI編程環(huán)境下:
$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編程環(huán)境下:
$strtest = “yyg中文字符yyg”;
$pregstr = "/[\x{4e00}-\x{9fa5}]+/u";
if(preg_match($pregstr,$strtest,$matchArray)){
echo $matchArray[0];
}
//output:中文字符
聯(lián)系客服