PHP的中文字符串截取
2016-02-01 15:13
PHP
中文截取
mb_substr
乱码
摘要:PHP 截取中文字符串容易乱码,整理一下用 mb_substr、iconv_substr 和正则表达式三种兼容方案。
今天写代码又遇到了关于字符串截取的问题,substr截取中文字符串会出现乱码的问题,PHP还提供了两个函数来截取字符串,分别是 mb_substr 和 iconv_substr,如果你的环境中没有这两个函数,那么还有其他办法解决,麻烦的地方就是需要你知道字符串编码并且知道中文在该编码下的编码范围。我这里提供一小段代码做参考,也是方便我再遇到这种问题可以很快的搞定。
/**
* 中文字符串截取
* @param string $str 要截取的字符串
* @param int $start 截取起始位置
* @param int $length 截取的长度
* @param string $charset 字符串编码
* @param boolean $suffix 是否使用后缀
* @param string $suffix_str 后缀字符串
* @return string
*/
function cn_substr($str, $start = 0, $length, $charset = 'utf-8', $suffix = true, $suffix_str = '...') {
if (function_exists('mb_substr')) {
$slice = mb_substr($str, $start, $length, $charset);
} elseif (function_exists('iconv_substr')) {
$slice = iconv_substr($str, $start, $length, $charset);
} else {
$re['utf-8'] = '/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/';
$re['gb2312'] = '/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/';
$re['gbk'] = '/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/';
$re['big5'] = '/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/';
preg_match_all($re[$charset], $str, $match);
$slice = join('', array_slice($match[0], $start, $length));
}
return $suffix ? $slice . $suffix_str : $slice;
}