/**
* 截取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;
}
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.ihulang.com/index/info/8.html