特定中文字符串正则匹配

最近遇到了一个匹配中文特定字符串的问题,记录下来正则表达式

问题描述:匹配“美丽乡村”中的一个字符或几个,若是是多个字符,顺序不能改变,如“丽乡”函数

解决过程:post

以前知道匹配中文字符串,正则表达式中使用的是unicode编码的范围,如/^[x{4e00}-x{9fa5}]+$/u编码

想着特定字符是否能够不用转换成unicode编码,因而写出正则  '/^[美]{0,1}[丽]{0,1}[乡]{0,1}[村}]{0,1}$/u',总不能正确匹配3d

因而把汉字改为unicode编码,正则  /^[\x{7f8e}]{0,1}[\x{4e3d}]{0,1}[\x{4e61}]{0,1}[\x{6751}]{0,1}$/u 匹配成功code

 

转换unicode编码的函数,一开始用unicode_encode,在个人笔记本上能够正常匹配,可是到公司一试,居然不能正常匹配,因而把"美"字的unicode编码打印出来,unicode

竟然是“8e7f”,两个字节颠倒了,百度了一下,原来是unicode编码有大端小端,用两个字节表示,用大端编码时,要把低位数据是字符编码的高字节,高字节是字符编码的高字节。字符串

因而改用utf8StrToUnicode,成功解决。it

function unicode_encode($str, $encoding = 'UTF-8', $prefix = '[\x{', $postfix = '}]{0,1}') {
$str = iconv($encoding, 'UCS-2', $str);
$arrstr = str_split($str, 2);
$unistr = '';
for($i = 0, $len = count($arrstr); $i < $len; $i++) {
$dec = bin2hex($arrstr[$i]);
$unistr .= $prefix . $dec . $postfix;
}
return $unistr;
}

function utf8StrToUnicode($str ,$prefix = '[\x{', $postfix = '}]{0,1}') {    $strLen = mb_strlen($str);    $uniStr = '';    for($i = 0;$i<$strLen;$i++){        $unicode = 0;        $subStr = mb_substr($str,$i,1);        $unicode = (ord($subStr[0]) & 0x1F) << 12;        $unicode |= (ord($subStr[1]) & 0x3F) << 6;        $unicode |= (ord($subStr[2]) & 0x3F);        $uniStr .= $prefix . dechex($unicode) . $postfix;    }    $uniStr = '/^'.$uniStr.'$/u';    return $uniStr;}
相关文章
相关标签/搜索