zoukankan      html  css  js  c++  java
  • php 汉字判断

    判断有没有汉字:
     
    preg_match("/[\x{4e00}-\x{9fa5}]/u", $string)

    \x4e00-\x9fa5是汉字unicode的十六进制范围

    http://www.shuihan.com/article/146
     
    打开这个隐藏部分
    /***************************************************************************
    函数功能:截取GB2312以及GBK编码的字符串,可以设置截取位置和长度,2个长度代表一个汉字
    $str------------截取源字符串
    $start----------起始位置,不能为空,从1算起
    $len------------截取长度(2代表一个汉字),如果为空则截取到字符串末尾
    主意:该函数不能用于utf8编码字符串,会出现乱码
    **************************************************************************
    */
    function substr_for_gb2312($str,$start,$len=null)
    {
    $totlelength = strlen($str);

    //特例情况
    if ($len == null) $len = $totlelength;
    if ($len ==0) return "";
    if ($len >= $totlelength && $start == 0 ) return $str;
    if ($start > $totlelength) return "";

    //分析$start
    if ($start < 0 ) //$start<0时,转化为$start>0时的定位.
    {
    if ( abs($start) >= $totlelength )
    $start = 0;
    else
    $start = $totlelength - abs($start);
    }

    //确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.
    if ($start > 0)
    {
    $i = $start-1;
    $flag = -1;
    while ($i >= 0)
    {
    if ( ord(substr($str,$i,1)) > 160)
    {
    $flag = -1*$flag;
    }
    else break;
    $i--;
    }
    if($flag==1)
    {
    $start = $start - 1;
    $len++; //保证不位移.
    }
    }

    $str = substr($str,$start);//截除字符串$str的$start位前的字符
    $totlelength = strlen($str);

    //确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.
    if ($len<0) $len = $totlelength - abs($len);
    if ($len <= 0) return "";
    $i=min($len,$totlelength);
    $i--;
    $flag = -1;
    while ($i >= 0)
    {
    if (ord(substr($str,$i,1))>160)
    {
    $flag=-1*$flag;
    }
    else break;
    $i--;
    }

    if($flag == 1) $len=$len-1;
    $subit=substr($str,0,$len);

    return $subit;
    }

    /***************************************************************************
    函数功能:截取GB2312以及GBK编码的字符串,从第一个字符开始截取,2个长度代表一个汉字
    $str------------截取源字符串
    $len------------截取长度(2代表一个汉字)
    主意:该函数不能用于utf8编码字符串,会出现乱码
    **************************************************************************
    */
    function splitStr($str,$len)
    {
    if($len<=0)
    {
    return false;
    }
    else
    {
    $sLen=strlen($str);
    if($len>=$sLen)
    return $str;
    else
    {
    for($i=0;$i<($len-1);$i++)
    {
    if(ord(substr($str,$i,1))>0xa0)
    $i++;
    }

    if($i>=$len)
    return substr($str,0,$len);
    elseif(ord(substr($str,$i,1))>0xa0)
    return substr($str,0,$len-1);
    else
    return substr($str,0,$len);
    }
    }
    }


    /***************************************************************************
    函数功能:截取utf8或GB2312或者GBK编码的字符串,从第一个字符开始截取,1个长度代表一个汉字
    $sourcestr------------截取源字符串
    $cutlength------------截取长度(字数)
    这个函数很万能,但是相对前两个耗资源一些
    **************************************************************************
    */
    function substr_for_utf8($sourcestr,$cutlength)
    {
    $returnstr='';
    $i=0;
    $n=0;
    $str_length=strlen($sourcestr); //字符串的字节数
    while (($n<$cutlength) and ($i<=$str_length))
    {
    $temp_str=substr($sourcestr,$i,1);
    $ascnum=Ord($temp_str); //得到字符串中第$i位字符的ascii码
    if ($ascnum>=224) //如果ASCII位高与224,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
    $i=$i+3; //实际Byte计为3
    $n++; //字串长度计1
    }
    elseif ($ascnum>=192)//如果ASCII位高与192,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
    $i=$i+2; //实际Byte计为2
    $n++; //字串长度计1
    }
    elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,1);
    $i=$i+1; //实际的Byte数仍计1个
    $n++; //但考虑整体美观,大写字母计成一个高位字符
    }
    else //其他情况下,包括小写字母和半角标点符号,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,1);
    $i=$i+1; //实际的Byte数计1个
    $n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
    }
    }

    if ($str_length>$cutlength)
    {
    $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
    }

    return $returnstr;
    }


    ?>
  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/yifenghong/p/2380606.html
Copyright © 2011-2022 走看看