截取UTF-8字符串函数,中文长度当作2处理

2018-12-28 10:25:56 总阅读量:156,本日阅读:1,本周阅读:10,本月阅读:28 0条
/**
 * 截取UTF-8字符串,考虑中文字符长度
 * 
 * 该函数用于截取UTF-8编码的字符串,中文字符被当作2个字符长度处理
 * 当字符串长度超过指定的最大长度时,会进行截取,并可选择是否追加省略号
 * 
 * @param string $str 待截取的字符串
 * @param int $max 截取的最大长度
 * @param string $ex 追加的字符串,默认为空,例如可以设置为"..."
 * @return mixed|string 截取后的字符串
 */
function cutStr($str, $max, $ex = '')
{
    // 移除字符串中的HTML标签,并去除空格和制表符,以便准确计算长度
    $str = removeHtml($str);
    $str = str_replace(" ", "", $str);
    $str = str_replace(" ", "", $str);
    $str = str_replace(PHP_EOL, "", $str);
    $str = str_replace("\n", "", $str);
    $str = str_replace("\t", "", $str);
    // 如果最大长度小于1或字符串长度不超过最大长度,直接返回原字符串
    if ($max < 1 || strlen($str) <= $max) {
        return $str;
    }
    $len = strlen($str);
    // 确保最大长度不超过字符串的实际长度
    $max = min($max, $len);
    // 计算追加字符串的长度,加上1是为了考虑追加字符串后面可能需要的空格
    $ex_length = strlen($ex) + 1;
    // 如果最大长度小于追加字符串的长度,直接返回原字符串
    if ($max < $ex_length) {
        return $str;
    }
    $pos = 0;
    $cut_pos = 0;
    // 从最大长度开始向前遍历字符串,计算字符位置
    for ($i = $max - 1; $i > 0 && $pos < $len; $i--) {
        $char = ord($str[$pos]);
        // 处理ASCII字符
        if ($char < 128) {
            $pos++;
            // 处理3字节的UTF-8字符
        } elseif ($char >= 224 && $char <= 239) {
            $i--;
            $pos += 3;
            // 处理2字节的UTF-8字符
        } elseif ($char >= 192 && $char <= 223) {
            $pos += 2;
        }
        // 如果当前遍历位置加上追加字符串长度小于等于最大长度,记录截取位置
        if ($i <= $ex_length && 0 == $cut_pos) {
            $cut_pos = $pos;
        }
    }
    // 如果遍历结束后,位置大于等于字符串长度,说明不需要截取,返回原字符串
    if ($pos >= $len) {
        return $str;
    }
    // 根据截取位置返回截取后的字符串,如果存在截取位置,则加上追加字符串
    $result = $cut_pos ? substr($str, 0, $cut_pos) . $ex : substr($str, 0, $pos) . $ex;
    // 返回结果
    return $result;
}
标签 函数 PHP

非特殊说明,本博所有文章均为博主原创。

-----