字符串切割函数,一个字母算一个位置,一个字算2个位置
function str_cut($string, $length, $dot = '') {
$string = str_replace(array(
' ', '&', '"', ''', '“', '”', '—', '<', '>',
'·', '…'
), array(' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string);
$strlen = strlen($string);
if ($strlen <= $length)
return $string;
$maxi = $length - strlen($dot);
$strcut = '';
$n = $tn = $noc = 0;
while ($n < $strlen) {
$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 >= $maxi)
break;
}
if ($noc > $maxi)
$n -= $tn;
$strcut = substr($string, 0, $n);
$strcut = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $strcut);
return $strcut . $dot;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接