/** * 可以统计中文字符串长度的函数 * @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; }