zoukankan      html  css  js  c++  java
  • 特定中文字符串正则匹配

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

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

    解决过程:

    之前知道匹配中文字符串,正则表达式中使用的是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;
    }


  • 相关阅读:
    jQuery 遍历 table
    jQuery下拉框三级联动
    C# 读取Excel模板 修改某行某列的值 另存为新的Excel
    jQuery iframe之间相互调用
    设计模式
    Rookey.Frame企业级快速开发框架(学习笔记)
    在Gridview中实现多选
    Gridview改变单元格颜色
    SQLserver函数编写和使用方法
    SVN服务器搭建和使用(转载)
  • 原文地址:https://www.cnblogs.com/shiwaitaoyuan/p/6964603.html
Copyright © 2011-2022 走看看