在 CodeIgniter 裡面的 Text 補助函數,目前只適用於英文字體,不支援 utf-8 或者是簡體字體,bite 數超過2的都會出問題,當然是因為這是國外的 mvc 所以也沒有考慮到這麼週到就是了,也不是沒有辦法解決,之前就用了PHP官方網站所提供的一個函式來正確切割中文字串,就是要利用 ord 判斷 ASCII 編碼範圍,或者是可以使用 mb_substr 函式正確切割,之前寫一篇可以參考看看:[PHP] 如何切割中文標題。 底下是原本 CodeIgniter 所提供的 Text 函數
if ( ! function_exists('character_limiter')) { function character_limiter($str, $n = 500, $end_char = '…') { if (strlen($str) < $n) { return $str; } $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); if (strlen($str) <= $n) { return $str; } $out = ""; foreach (explode(' ', trim($str)) as $val) { $out .= $val.' '; if (strlen($out) >= $n) { $out = trim($out); return (strlen($out) == strlen($str)) ? $out : $out.$end_char; } } } }
character_limiter 不能用在中文切割字串,只能用於英文切割,所以自己就要加上切割的函數才可以正確使用喔,利用簡單的 mb_substr 就可以做到了,這算是 CodeIgniter 的 bug 嗎?好像也不是,不過自己有找到函數來使用,那就沒差了,自己可以定義函數在 libraries/ 底下:
$len) { $str .= "..."; break; } elseif ((ord(substr($string,$i,1)) <= 128) && ($count < $start)) { $count++; } elseif ((ord(substr($string,$i,1)) > 128) && ($count < $start)) { $count = $count+2; $i = $i+$byte-1; } elseif ((ord(substr($string,$i,1)) <= 128) && ($count >= $start)) { $str .= substr($string,$i,1); $count++; } elseif ((ord(substr($string,$i,1)) > 128) && ($count >= $start)) { $str .= substr($string,$i,$byte); $count = $count+2; $i = $i+$byte-1; } } return $str; } } ?>
utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2 現在都是用 utf-8,所以先把預設值 $byte 設定為 3,就可以正常使用了,使用方法是 $this->system->bite_str($string, $start, $len) 寫這樣就可以成功切割中文字串了。
See also
- 來聊聊 PHP & JavaScript & CSS 的 Coding Style
- 為什麼我選擇使用 Laravel Framework?
- Laravel 搭配 Google, Facebook, Twitter 第三方 OAuth 認證
- 將 wordpress 強制使用 SSL 連線
- PHP 7 vs HHVM Benchmark 比較
- Laravel 50 個小技巧 + Laravel 5.2 新功能
- Laravel Homestead 支援 MySQL 5.7 和 Node 5.0
- PHP-FIG 新網站
- Laravel Homestead 支援 PHP 7
- Laravel 5.1 is released