截取中文字符加省略号

复制代码
/**
     * 可以统计中文字符串长度的函数
     * @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 @   一个人的孤独自白  阅读(370)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示