• 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;
    }


    ?>
  • 相关阅读:
    SQLyog使用期限(治标不治本的,治本的还没找到)
    计算机系统第一章
    Netty实现远程调用RPC功能
    基于Redis实现分布式锁
    Java代理
    Java反射机制
    权限之菜单权限
    记录一次 数据库迁移 MSSQL 到MySql
    .net core2.0 使用数据库创建EF模型(db first)
    VS 函数,方法上方 引用等显示
  • 原文地址:https://www.cnblogs.com/yifenghong/p/2380606.html
Copyright © 2020-2023  润新知