本文目录导读:

- 推荐方案:使用 mb_substr()(多字节字符串函数)
- 兼容 GBK 编码
- 安全检测并启用 mbstring 扩展
- 自定义兼容函数(完全替代方案)
- WordPress 风格的截取函数
- 配置 php.ini 确保 mbstring 可用
- 完整的工具类示例
- 注意事项:
在PHP项目中实现字符串截取并兼容中文,推荐使用以下方法:
推荐方案:使用 mb_substr()(多字节字符串函数)
// 基本用法
$text = "Hello世界,PHP字符串截取测试";
$result = mb_substr($text, 0, 10, 'UTF-8');
echo $result; // 输出:Hello世界,P
// 参数说明:mb_substr(字符串, 起始位置, 长度, 编码)
$text = "你好世界Hello";
$sub = mb_substr($text, 2, 4, 'UTF-8');
echo $sub; // 输出:世界He
// 截取并添加省略号
function mb_substr_with_ellipsis($str, $length, $encoding = 'UTF-8') {
if (mb_strlen($str, $encoding) > $length) {
return mb_substr($str, 0, $length, $encoding) . '...';
}
return $str;
}
$longText = "这是一段很长的中文文本,需要截取显示...";
echo mb_substr_with_ellipsis($longText, 10); // 输出:这是一段很长的中文文本...
兼容 GBK 编码
// 处理GBK编码的中文 $text = "你好世界Hello"; $sub = mb_substr($text, 0, 4, 'GBK'); echo $sub; // 输出:你好世
安全检测并启用 mbstring 扩展
// 检测 mbstring 扩展是否可用
if (function_exists('mb_substr')) {
$result = mb_substr($text, 0, 10, 'UTF-8');
} else {
// 降级处理:使用自定义函数
$result = utf8_substr($text, 0, 10);
}
// 自定义 UTF-8 截取函数(备选方案)
function utf8_substr($str, $start, $length = null) {
return mb_substr($str, $start, $length, 'UTF-8');
}
自定义兼容函数(完全替代方案)
/**
* 兼容中文字符串截取
*/
function safe_substr($str, $start, $length = null, $encoding = 'UTF-8') {
if (function_exists('mb_substr')) {
return mb_substr($str, $start, $length, $encoding);
}
// 不使用 mbstring 时的备选方案
return iconv_substr($str, $start, $length, $encoding);
}
// 更完善的版本(处理省略号)
function truncate_chinese($string, $length = 30, $ellipsis = '...') {
if (mb_strlen($string, 'UTF-8') <= $length) {
return $string;
}
return mb_substr($string, 0, $length, 'UTF-8') . $ellipsis;
}
WordPress 风格的截取函数
/**
* 类似 WordPress 的 wp_trim_words 功能
*/
function chinese_trim_words($text, $num_words = 55, $more = '...') {
if (mb_strlen($text, 'UTF-8') > $num_words) {
$text = mb_substr($text, 0, $num_words, 'UTF-8') . $more;
}
return $text;
}
配置 php.ini 确保 mbstring 可用
; 在 php.ini 中启用 extension=mbstring ; 设置默认编码 mbstring.language = Neutral mbstring.internal_encoding = UTF-8 mbstring.http_input = UTF-8 mbstring.http_output = UTF-8
完整的工具类示例
class StringHelper {
/**
* 安全的字符串截取
*/
public static function substr($string, $start, $length = null, $encoding = 'UTF-8') {
if (function_exists('mb_substr')) {
return mb_substr($string, $start, $length, $encoding);
}
return substr($string, $start, $length);
}
/**
* 获取字符串长度
*/
public static function strlen($string, $encoding = 'UTF-8') {
if (function_exists('mb_strlen')) {
return mb_strlen($string, $encoding);
}
return strlen($string);
}
}
// 使用示例
echo StringHelper::substr("中文测试English", 0, 6); // 输出:中文测试En
注意事项:
- 始终指定编码参数,避免依赖系统默认编码
- 确保服务器已安装 mbstring 扩展
- UTF-8 是最常用的编码,建议统一使用
- 注意截取长度单位:mb_substr 是按字符数,不是字节数
- 处理省略号时要考虑字符数变化
使用 mb_substr() 是最稳定、最兼容的方案,它能正确处理各种多字节编码的中文、日文、韩文等字符。