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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值