php截取中文字符串函数及测试

字符串截取对于我们码农来说是家常便饭了,网页前台后台都容易用到,但是对一些中英文混合的字符串截取还是头疼容易出现乱码,因为汉字在gb2312编码中占有2个字符,所以容易出现截取一半的情况。我也一直想找这样的一些库函数,比如mb_substr函数,不过使用它需要php依赖附加一些库的加载。

$str = "my英文名ciaos";
print_r(substr($str,0,3)); //输出"my?"
print_r(substr($str,3,3)); //输出"⑽?"

可以看见substr字符串截取是多么费劲了吧,我也参照了网上别人的一些例子,没有发现一个满意好用的,于是自己修改其中一个并做一些字符串截取的测试,希望能保证准确性。函数代码如下:

/**
 * my_substr()
 * 
 * deal with "gb2312" encode string
 * 
 * @param string $str
 * @param int $start
 * @param int $length
 * @param bool $append
 * @return result
 */
function my_substr($str,$start,$length,$append = false)
{
    $retstr = '';
    $strlen = strlen($str);
    
    for($i=0; $i<$strlen; $i++)
    {
        if($i>=$start && $i< ($start+$length))
        {
            if(ord(substr($str, $i, 1))>127)
            {
                $retstr.= substr($str, $i, 2);
            }
            else
            {
                $retstr.= substr($str, $i, 1);
            }
        }
        if($i>$start+$length) {break;}
        if(ord(substr($str, $i, 1))>127) $i++;
    }
    
    if($i<$strlen && $append){ 
        $retstr.= "..."; 
    }
    
    return $retstr;
}
代码很少很简单,我们来做一些测试看看效果,同样是上面那个错误示例。

$str = "my英文名ciaos";
print_r(my_substr($str, 0, 3)); //输出"my英"(如果结束于汉字中间,则追加显示中文)
print_r(my_substr($str, 3, 3)); //输出"文"  (如果起始于汉字中间,则抛弃首位汉字)
调换字符串再测试一次

$str = "我的ciaos英文名";
print_r(my_substr($str, 0, 3)); //输出"我的"(如果结束于汉字中间,则追加显示中文)
print_r(my_substr($str, 3, 3)); //输出"ci"  (如果起始于汉字中间,则抛弃首位汉字)
my_substr函数最后一个参数默认为false,控制是否在截取的字符串后面加上省略号。

$str = "我的ciaos英文名";
print_r(my_substr($str, 7, 20, true)); //输出"os英文名"(字符串截取到最后了,不用追加省略号)
print_r(my_substr($str, 7, 3, true)); //输出"os英..."  (字符串未达到最后,追加省略号)
对于UTF-8编码的字符串截取需要别的处理,毕竟中文字符需要占据三个字节,我这个函数应该能处理大多前台网页截取字符串的需求了




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值