PHP-截取中英混合的字符串

PHP-截取中英混合的字符串

浮生未歇 发布于 2017-02-17 字数 130 浏览 1121 回复 3

在gbk,utf8里中文里每个字占的字节不一样,
再加上字符如果多也不好判断,
现在希望大家能提供一个合理的截取中英的代码

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-10-27 3 楼
瑾兮 2017-10-13 2 楼

截取中英文字符串需要考虑以下几个方面:
1、对中英文计算长度分开,比如汉字为2个字符,数字和英文符号为1个字符;
2、截取的时候分编码类型,如utf-8下和gb2312编码的不同;
3、在截取的时候,如果截取的字符串正好为半个汉字,那么需要判断是否将此汉字全截取掉,如果只截取一半的话会出现编码问题。

////////////////////////////////////////////////////////////////////
// PHP截取中英文及标点符号混合的字符串函数(绝对不会出现乱码)
// 本程序在utf-8、gb2312中测试通过。使用者自行测试big5。
// 函数 left( 源字符串, 截取指定的字符串个数, 编码(可省略,默认为utf-8) )
////////////////////////////////////////////////////////////////////
function left_watcher($str, $len, $charset="utf-8"){
//如果截取长度小于等于0,则返回空
if( !is_numeric($len) or $len <= 0 ){
return "";
}
//如果截取长度大于总字符串长度,则直接返回当前字符串
$sLen = strlen($str);
if( $len >= $sLen ){
return $str;
}
if ( strtolower($charset) == "utf-8" ){
$len_step = 3;
}else{
$len_step = 2;
}
$len_i = 0;
$substr_len = 0;
for( $i=0; $i < $sLen; $i++ ){
if ( $len_i >= $len ) break;
if( ord(substr($str,$i,1)) > 0xa0 ){
$i += $len_step - 1;
$substr_len += $len_step;
}else{
$substr_len ++;
}
$len_i ++;
}
$result_str = substr($str,0,$substr_len );
return $result_str;
}

参考资料:PHP截取中英文及标点符号混合的字符串函数

甜柠檬 2017-10-01 1 楼

这是以前收藏的一个好用的处理截取函数:

function get_word($string, $length, $dot = '..',$charset='gbk') {

if(strlen($string) <= $length) {
return $string;
}
$string = str_replace(array(' ',' ', '&', '"', '<', '>'), array('','','&', '"', '<', '>'), $string);
$strcut = '';
if(strtolower($charset) == 'utf-8') {
$n = $tn = $noc = 0;
while($n < strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noc++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noc += 2;
} elseif(224 <= $t && $t < 239) {
$tn = 3; $n += 3; $noc += 2;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noc += 2;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noc += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noc += 2;
} else {
$n++;
}
if($noc >= $length) {
break;
}
}
if($noc > $length) {
$n -= $tn;
}
$strcut = substr($string, 0, $n);
} else {
for($i = 0; $i < $length; $i++) {
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
}
}

return $strcut.$dot;
}
$str = "测试 visit 字符串 nowamagic";
$str_result = get_word($str, 12);
echo $str_result;