php 截取字符串

php 自带几种字符串截取函数,其中常用的就是 substr 和 mb_substr 。前者在处理中文时,gbk为2个长度单位,utf为3个长度单位。后者指定编码后,一个中文即为1个长度单位。

substr 不用说,有时会截1/3个中文或半个中文,当然现实出来乱码了,相对来说mb_substr 更适合我们使用。不过有时候mb_substr就显得不那么好用了。例如我要显示一个小图片的简要信息,5个中文正好,超过5个就截取前4再加上"...",这样处理中文是没问题,可是处理英文或数字,这样截取就太短了。

 

实例如下:

<?php
    function g_substr($str, $len = 12, $dot = true) {
        $i = 0;	//$i起始截取位置,默认为0,中文utf-8,每次增加3,gbk,每次增加2 英文每次增加1
        $l = 0;	//$l的值随着截取自增加  中文增加2 英文增加1,这样就成了1个中文对2个英文的截取模式
        $c = 0;	//$c的值截取增加  中文utf-8增加3,gbk增加2 英文增加1
        $a = array();
        while ($l < $len) {			//$l<$len就继续
            $t = substr($str, $i, 1);	//截取字符串 判断$t的ascii ord()转换为ascii编码 	
            if (ord($t) >= 224) {		//大于224 中文utf-8 一个汉字3个占字符
                $c = 3;
                $t = substr($str, $i, $c);	//截取时,从起始位置往后截取3个字符
                $l += 2;
            } elseif (ord($t) >= 192) {	//大于192 中文gbk 一个汉字2个占字符
                $c = 2;
                $t = substr($str, $i, $c);	//截取时,从起始位置往后截取2个字符 
                $l += 2;
            } else {
                $c = 1;
                $l++;
            }
            // $t = substr($str, $i, $c);
            $i += $c;			//起始位置变更,中文utf-8 增3,中文gbk 增2 英文 增1
            if ($l > $len) break;		
            $a[] = $t;			//赋值给数组
        }
        $re = implode('', $a);		//转化为字符串
        if (substr($str, $i, 1) !== false) {	//判断$len长度后是否还有字符
            array_pop($a);			//删除数组的最后一位 适用于中文utf-8和gbk
            ($c == 1) and array_pop($a);	//判断是否为英文 是英文的话在删除最后一位
            $re = implode('', $a);		//转换为字符串
            $dot and $re .= '...';		
        }
        return $re;
    }
	
    echo g_substr("xxxxxxxxxxxxxxxxxxxxxxx");
    echo "<br/>";
    echo g_substr("菠萝菠萝菠萝菠萝菠萝菠萝菠萝");


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值