中英文混排計數、截取,不用自訂函數,而是使用php的mb擴充,使用原生態的php函數輕鬆處理字串截取。 首先,介紹下常用函數來截取字串。mb_strwidth($str, $encoding) 返回字串的寬度$str 要計算的字串$encoding 要使用的編碼,如 utf8、gbkmb_strimwidth($str, $start, $width, $tail, $encoding) 按寬度截取字串 $str 要截取的字串$start 從哪個位置開始截取,預設是0$width 要截取的寬度$tail 追加到截取字串後邊的字串,常用的是 ...$encoding 要使用的編碼 例子:
- /**
- * utf8 編碼格式
- * 1個中文佔用3個位元組
- * 我們希望的是1個中文佔用2個位元組,
- * 因為從寬度上看2個英文字母佔用的位置相當於1個中文
- */
- // 測試字串
- $str = 'aaaa啊啊aaaa啊啊啊aaa';
- echo strlen($str); // 只用strlen輸出為25個位元組
- // 必須指定編碼,不然會使用php的內碼 mb_internal_encoding()可以查看內碼
- // 使用mb_strwidth輸出字串的寬度為20使用utf8編碼
- echo mb_strwidth($str, 'utf8');
- // 只有寬度大於10才截取
- if(mb_strwidth($str, 'utf8')>10){
- // 此處設定從0開始截取,取10個追加...,使用utf8編碼
- // 注意追加的...也會被計算到長度之內
- $str = mb_strimwidth($str, 0, 10, '...', 'utf8');
- }
- // 最後輸出 aaaa啊... 4個a算4個 1個啊算2個 3個點算3個 4+2+3=9
- // 是不是很簡單啊,有的人說了為什麼是9個不是10個嗎?
- // 因為正好“啊”的後邊還是“啊”,中文算2個,9+2=11 超出了設定,所以去掉1個就是9了
- echo $str;
複製代碼其它字串截取函數:mb_strlen($str, $encoding) 返回字串的長度$str 要計算的字串$encoding 使用的編碼 mb_substr($str, $start, $length, $encoding) 截取字串$str 要截取的字串$start 從哪裡開始截取$length 截取多長$encoding 使用的編碼其實這2個函數和strlen()、substr()很像,唯一的不同就是可以設定編碼。 以上二個字串截取函數的例子。
- /**
- * utf8 編碼格式
- * 1個中文佔用3個位元組
- */
- $str = 'aa12啊aa';
- echo strlen($str); // 直接輸出長度為9
- // 輸出長度為7,為什麼是7呢?
- // 注意這裡設定編碼以後,不管是中文還是英文每個長度都為1
- // a a 1 2 啊 a a
- // 1+1+1+1+1+1+1 = 7
- // 是不是正好7個字元啊
- echo mb_strlen($str, 'utf8');
- // 同樣mb_substr也是一樣的
- // 我現在只想要5個字元
- echo mb_substr($str, 0, 5, 'utf8'); // 輸出 aa12啊
複製代碼mb擴充庫中還有很多實用函數,這裡不一一介紹了,大家有興趣的話可以參考下php手冊中的相關內容。 |