截取中文字符加省略号

/**
     * 可以统计中文字符串长度的函数
     * @param $str 要计算长度的字符串,一个中文算一个字符
     * @return int
     */
    public static function absLength($str)
    {
        if (empty($str)) {
            return 0;
        }
        if (function_exists('mb_strlen')) {
            return mb_strlen($str, 'utf-8');
        } else {
            preg_match_all("/./u", $str, $ar);
            return count($ar[0]);
        }
    }

    /**
     * utf-8编码下截取中文字符串,参数可以参照substr函数
     * @param $str 要进行截取的字符串
     * @param int $start 要进行截取的开始位置,负数为反向截取
     * @param $end 要进行截取的长度
     * @return bool|string
     */
    public static function utf8Substr($str, $start = 0, $end)
    {
        if (empty($str)) {
            return false;
        }
        if (function_exists('mb_substr')) {
            if (func_num_args() >= 3) {
                $end = func_get_arg(2);
                return mb_substr($str, $start, $end, 'utf-8');
            } else {
                mb_internal_encoding("UTF-8");
                return mb_substr($str, $start);
            }

        } else {
            $null = "";
            preg_match_all("/./u", $str, $ar);
            if (func_num_args() >= 3) {
                $end = func_get_arg(2);
                return join($null, array_slice($ar[0], $start, $end));
            } else {
                return join($null, array_slice($ar[0], $start));
            }
        }
    }
/**
     * 截取中文字符加省略号
     * @param $string
     * @param $start
     * @param null $length
     * @param string $suffix
     * @return bool|string
     */
    public static function mbSubString($string, $start, $length = null, $suffix = '...')
    {
        if ($length !== null) {
            $substr = self::utf8Substr($string, $start, $length);
            $str_length = self::absLength($string);
            if ($str_length > $length) {
                $substr .= $suffix;
            }
        } else {
            $substr = self::utf8Substr($string, $start);
        }
        return $substr;
    }

 

posted @ 2017-07-11 09:53  一个人的孤独自白  阅读(368)  评论(0编辑  收藏  举报