CodeIgniterの学習 40 - テキストヘルパの character_limiter()(指定した文字数の位置での切取) の日本語(マルチバイト)対応をしてみる
今日は簡単なネタ。CodeIgniterのテキストヘルパは日本語(マルチバイト)に対応していないので
ちょこちょこ対応させてみることにする。便利なので貼っておく。
ありふれているので、既に解決例があるかも知れない(ネタが被っているかもしれない)けどしらん。
(実は買おうと思いつつまだCodeIgniter徹底入門買ってないのだ。もし被ってたらごめんなさい)
まずはcharacter_limiter()から。
使い方と画面
マニュアルのテキストヘルパの、character_limiter()と同じ。character_limiter( $foo,5);とかすれば、$fooを5文字でぶった切ってくれる。
こんなかんじ。
character_limiter( $foo,5) 有りの場合:
5文字目で切れてる。
実際は 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 */ ?>