CodeIgniterの学習 40 - テキストヘルパの character_limiter()(指定した文字数の位置での切取) の日本語(マルチバイト)対応をしてみる

今日は簡単なネタ。CodeIgniterのテキストヘルパは日本語(マルチバイト)に対応していないので
ちょこちょこ対応させてみることにする。便利なので貼っておく。

ありふれているので、既に解決例があるかも知れない(ネタが被っているかもしれない)けどしらん。
(実は買おうと思いつつまだCodeIgniter徹底入門買ってないのだ。もし被ってたらごめんなさい)

まずはcharacter_limiter()から。


使い方と画面

マニュアルのテキストヘルパの、character_limiter()と同じ。
character_limiter( $foo,5);とかすれば、$fooを5文字でぶった切ってくれる。

こんなかんじ。
character_limiter( $foo,5) 有りの場合:

5文字目で切れてる。

character_limiter() 無しの場合:

長っ

実際は h( character_limiter( $row -> memo, 20 ) ) みたいにHTMLエンティティ変換もかましている)

ソース

mb_系を使えてかつUTF-8な環境以外は知らん。
(今時理由無く、クラからEUCとかSJISとかふざけた指定があったら、後の人のために全力で却下してください。)

(元ソースのやり方にあわせると、コメントアウトしている側を生かして一文字ずつ分解してループ)


(08/11/14部分変更 一応$config['charset']を見るようにした。でも余計な呼び出しが増えるよねぇ。)

application/helpers/MY_text_helper.php

<?php if ( ! defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
/**
 * Character Limiter
 *
 * Limits the string based on the character count.  Preserves complete words
 * so the character count may not be exactly as specified.
 *
 * @access public
 * @param string $
 * @param integer $
 * @param string $ the end character. Usually an ellipsis
 * @return string
 */
if ( ! function_exists( 'character_limiter' ) ) {
  function character_limiter( $str, $n = 500, $end_char = ' ...' )
  {
    $CI =& get_instance();
    $charset = $CI->config->item('charset');
    
    if ( mb_strlen( $str , $charset) < $n ) {
      return $str ;
    }

    $str = preg_replace( "/\s+/iu", ' ', str_replace( array( "\r\n", "\r", "\n" ), ' ', $str ) );

    if ( mb_strlen( $str , $charset) <= $n ) {
      return $str;
    }
    /*
      //元ソースのやり方に従うとこっち
      $out = "";
      $arr = preg_split( '//iu', trim( $str ), -1, PREG_SPLIT_NO_EMPTY );
      foreach ( $arr as $val ) {
        $out .= $val ;
        if ( mb_strlen( $out , $charset ) >= $n ) {
          return trim( $out ) . $end_char;
        }
      }
    */
    //mb_系使うならこっちでもいいじゃん
    return mb_substr(trim($str), 0, $n ,$charset) . $end_char ;

  }
}

/**
 * End of file MY_text_helper.php
 */
/**
 * Location: ./application/helpers/MY_text_helper.php
 */
 ?>