PHP的中文字符串截取

今天写代码又遇到了关于字符串截取的问题,substr截取中文字符串会出现乱码的问题,PHP还提供了两个函数来截取字符串,分别是 mb_substr 和 iconv_substr,如果你的环境中没有这两个函数,那么还有其他办法解决,麻烦的地方就是需要你知道字符串编码并且知道中文在该编码下的编码范围。我这里提供一小段代码做参考,也是方便我再遇到这种问题可以很快的搞定。

/**
 * 中文字符串截取
 * @param  string  $str        要截取的字符串
 * @param  int     $start      截取起始位置
 * @param  int     $length     截取的长度
 * @param  string  $charset    字符串编码
 * @param  boolean $suffix     是否使用后缀
 * @param  string  $suffix_str 后缀字符串
 * @return string
 */
function cn_substr($str, $start = 0, $length, $charset = 'utf-8', $suffix = true, $suffix_str = '...') {
    if (function_exists('mb_substr')) {
        $slice = mb_substr($str, $start, $length, $charset);
    } elseif (function_exists('iconv_substr')) {
        $slice = iconv_substr($str, $start, $length, $charset);
    } else {
        $re['utf-8'] = '/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/';
        $re['gb2312'] = '/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/';
        $re['gbk'] = '/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/';
        $re['big5'] = '/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/';
        preg_match_all($re[$charset], $str, $match);
        $slice = join('', array_slice($match[0], $start, $length));
    }
    return $suffix ? $slice . $suffix_str : $slice;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注