function msubstr($str, $start, $len) {
$strlen = $start + $len;
$tmpstr = '';
for ($i = 0; $i < $strlen; $i++) {
if (ord(substr($str, $i, 1)) > 0xA0) {
$tmpstr .= substr($str, $i, 2);
$i++;
} else {
$tmpstr .= substr($str, $i, 1);
}
}
return $tmpstr;
}
假設雙字節字符高位 > 0xA0(GB2312/GBK 適用,**UTF-8 不完全適用**,中文佔 3 字節)。
function csubstr($str, $start, $len) {
$strlen = strlen($str);
$clen = 0; $tmpstr = '';
for ($i = 0; $i < $strlen; $i++, $clen++) {
if ($clen >= $start + $len) break;
if (ord(substr($str, $i, 1)) > 0xA0) {
if ($clen >= $start) $tmpstr .= substr($str, $i, 2);
$i++;
} else {
if ($clen >= $start) $tmpstr .= substr($str, $i, 1);
}
}
return $tmpstr;
}
function showShort($str, $len) {
$tempstr = csubstr($str, 0, $len);
if ($str !== $tempstr) $tempstr .= "...";
return $tempstr;
}
$len = 19; $text = "怎麼將新聞的很長的標題只顯示前面一些字,後面用.....來代替?"; echo strlen($text) <= $len ? $text : (substr($text, 0, $len) . chr(0) . "....");
缺陷:按字節截取,UTF-8 中文會截半個字符產生亂碼,且 chr(0) 為不可见字符。
function mb_truncate($str, $length, $etc = '...') {
if (mb_strlen($str, 'UTF-8') <= $length) return $str;
return mb_substr($str, 0, $length, 'UTF-8') . $etc;
}
mb_strlen/mb_substr 正確按字符處理 UTF-8。mbstring 擴展(現代 PHP 環境默認開啟)。