cn_substr substr()函数中文版 mb_substr也可以完成

来源:互联网 发布:python 调用百度搜索 编辑:程序博客网 时间:2024/04/27 01:56

if(!function_exists('cn_substr')){    function cn_substr($string='',$start=0,$length=0,$lang='gbk'){        switch($lang){            case 'gbk':$step = 1;break;            case 'utf-8';$step = 2;break;            default:$step = 2;break;        }        $result = '';        $stringlength = strlen($string);        $length = intval($length);        $start = intval($start);        if($length==0||$stringlength<$start+1){            return '';        }        $index = 0;        for($i=0;$i<$stringlength;$i++){            $char = '';            if($length){                if(ord($string[$i])>0x80){                    for($j=$i;$j<=$i+$step;$j++){                        $char .= $string[$j];                    }                    $i+=$step;                }else{                    $char = $string[$i];                }                $index++;                if($index>=$start){                    $length--;                    $result .= $char;                }            }else{                break;            }        }        return $result;    }}echo cn_substr('left花衣', 1, 4);




php截取utf8字符串和gbk字符串函数

2012年06月09日PHP技术文章暂无评论阅读 270 views 次

在 PHP 中,我们直接使用PHP strlen函数进行字符串截取,对于英文字符,没有什么区别,输出的结果都是一样的,而在截取中文时,却有一点小小的问题,我们知道,字符分为两种状态,一种是 gbk 字符串,另一种就是 utf-8 字符串,如果按照常规的输出方法,输出的结果是不一样的。

php strlen 函数最基本的参数有 str 字符串,len 长度,start 开始位置,如果截取的字符串 gbk 格式,那么 len 的步长为 1,截取“夏日博客”,只取前两个字符,输出就是“夏日”,而截取的字符串类型是 utf-8 格式的话,那么 len的步长则为 2,输出的结果为“夏日博”,这也就是两种格式输出不一样的原因。

简要说明一下截出输入的步长,以“夏日博客”为例,步长从 0 开始,从开始的“夏”之前开始算起,第一步为0,则“夏”之后为第二步为 1,依此类推。

依照上述原理,我们可以写一个同时支持截取 gbk 和 utf-8 字符的函数,如下:




------------------------------------------------------------------------

cn_substr 只支持utf-8


substr()函数中文版 普通的substr()函数可以取得字符串的指定长度子字符串,但遇到中文时可能会在新字符串末尾产生乱码,下面这个函数将超过$len长度的字符串转换成以“...”结尾,并且去除了乱码。 

用法:$new =

substr($old,20);

function cn_substr($str,$len) { $end = $len<strlen($str)?$len:strlen($str);    for($i = 0;$i <$end;$i++)     {         if ($i >=0 AND $i <$end)         {             if(ord(substr($str,$i,1)) > 0xa1)                  $result_str.=substr($str,$i,2);             else                 $result_str.=substr($str,$i,1);         }         if(ord(substr($str,$i,1)) > 0xa1)             $i++;     }  return $result_str;     if(strlen($str)<=$end)         return $result_str;     else         return $result_str."..."; }

function sub_str($str, $length = 0, $append = true){    $str = trim($str);    $strlength = strlen($str);     if ($length == 0 || $length >= $strlength)    {        return $str;  //截取长度等于0或大于等于本字符串的长度,返回字符串本身    }    elseif ($length < 0)  //如果截取长度为负数    {        $length = $strlength + $length;//那么截取长度就等于字符串长度减去截取长度        if ($length < 0)        {            $length = $strlength;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度        }    }     if (function_exists('mb_substr'))    {        $newstr = mb_substr($str, 0, $length, EC_CHARSET);    }    elseif (function_exists('iconv_substr'))    {        $newstr = iconv_substr($str, 0, $length, EC_CHARSET);    }    else    {        //$newstr = trim_right(substr($str, 0, $length));        $newstr = substr($str, 0, $length);    }     if ($append && $str != $newstr)    {        $newstr .= '...';    }     return


0 0
原创粉丝点击