PHP 自帶幾種字串截取函數,其中常用到的就是 substr 和 mb_substr。前者在處理中文時,GBK 為 2 個長度單位,UTF 為 3 個長度單位,後者指定編碼後,一個中文即為 1 個長度單位。
mb_substr用法
string mb_substr( string$str, int$start[, int$length[, string$encoding]] );
mb_substr 執行一個多位元組安全的substr()操作基礎上的字元數。從str的開始位置計算。第一個字元的位置為0。第二個字元的位置是1,依此類推:
str 被截取的母字串。
start開始位置。
length 傳回的字串的最大長度,如果省略,則截取到str末尾。
encoding 參數為字元編碼。如果省略,則使用內部字元編碼。
那我們可以使用一下的程式碼,來完成這個問題。
$mess=mb_substr($message,0,19,'gb2312');
gb2312就是中文的編碼格式。
mb_substr處理中英文混合字串
substr 有時會截取 1/3 個中文或半個中文,會顯示亂碼,相對來說 mb_substr 比較適合我們使用。不過有時候 mb_substr 就顯得沒那麼好用了。例如我要顯示一個小圖片的簡要信息,5 個中文正好,超過5 個就截取前4再加上“…”,這樣處理中文是沒問題了,可是處理英文或數字,這樣截取就太短了。使用下面這段函數可以解決這個問題:
<?php /** * 字符串截取 * * @author gesion * @param string $str 原始字符串 * @param int $len 截取长度(中文/全角符号默认为 2 个单位,英文/数字为 1。 * 例如:长度 12 表示 6 个中文或全角字符或 12 个英文或数字) * @param bool $dot 是否加点(若字符串超过 $len 长度,则后面加 "...") * @return string */ class Onens { public static function g_substr($str, $len = 12, $dot = true) { $i = 0; $l = 0; $c = 0; $a = array(); while ($l < $len) { $t = substr($str, $i, 1); if (ord($t) >= 224) { $c = 3; $t = substr($str, $i, $c); $l += 2; } elseif (ord($t) >= 192) { $c = 2; $t = substr($str, $i, $c); $l += 2; } else { $c = 1; $l++; } // $t = substr($str, $i, $c); $i += $c; if ($l > $len) break; $a[] = $t; } $re = implode('', $a); if (substr($str, $i, 1) !== false) { array_pop($a); ($c == 1) and array_pop($a); $re = implode('', $a); $dot and $re .= '...'; } return $re; } }