[CodeIgniter] Text 補助函數 character_limiter 不適用於中文字

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