特定中⽂字符串正则匹配
最近遇到了⼀个匹配中⽂特定字符串的问题,记录下来
问题描述:匹配“美丽乡村”中的⼀个字符或⼏个,如果是多个字符,顺序不能改变,如“丽乡”
解决过程:
之前知道匹配中⽂字符串,正则表达式中使⽤的是unicode编码的范围,如/^[x{4e00}-x{9fa5}]+$/u
想着特定字符是否可以不⽤转换成unicode编码,于是写出正则 '/^[美]{0,1}[丽]{0,1}[乡]{0,1}[村}]{0,1}$/u',总不能正确匹配
于是把汉字改成unicode编码,正则 /^[\x{7f8e}]{0,1}[\x{4e3d}]{0,1}[\x{4e61}]{0,1}[\x{6751}]{0,1}$/u 匹配成功
转换unicode编码的函数,⼀开始⽤unicode_encode,在我的笔记本上可以正常匹配,但是到公司⼀试,竟然不能正常匹配,于是把"美"字的unicode编码打印出来,
居然是“8e7f”,两个字节颠倒了,百度了⼀下,原来是unicode编码有⼤端⼩端,⽤两个字节表⽰,⽤⼤端编码时,要把低位数据是字符编码的⾼字节,⾼字节是字符编码的⾼字节。
于是改⽤utf8StrToUnicode,成功解决。
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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论