/*
* 字节截取,英文一个,中文等双字节按2算;
* 调用形态 byteSub ($str, 1, 8, '...');
* start与len都是按单字节算;
* start如果是处于半个中文,就取该整个中文;
* len如果处于半个中文,就不包含此中文;
* start从0开始,不是>=0,自动设置成0
* len 从0开始,如果不是>=0,自动设置成0
*/
function byteSub($str = '', $start = 0, $len = null, $more = '') {
if ( ($str == '') || is_null($str)) return '';
$code = 'UTF-8';
$str = mb_convert_encoding($str, $code, mb_detect_encoding($str, 'ASCII,EUC-CN,UTF-8'));
$start = (int)$start > 0 ? (int)$start : 0;
$len = (int)$len > 0 ? (int)$len : null;
$cl = $byteL = 0;
$sub = '';
$sLen = mb_strlen($str, $code);
for ($i = 0; $i < $sLen; $i++) {
$val = mb_substr($str, $i, 1, $code);
$cl = ord($val) >= 128 ? 2 : 1;
$byteL += $cl;
if ($start >= $byteL) {//还不到开始位
continue;
}
if (
is_null($len) //取完
|| (($len -= $cl) >= 0) //取本字时不超过
) {
$sub .= $val;
} else {//取超了
$more && ($sub .= $more);
break;
}
}
return $sub;
}
php版本的英文计1,中文计2的截字方法,自动支持utf8与gbk
最新推荐文章于 2021-08-19 16:28:40 发布