Webtech Walker

smartyでマルチバイトに対応したtruncate修飾子

smartyのtruncate修飾子は指定した文字数で文章を切って、切ったらその後に”・・・”など任意の文字を追加してくれる便利な修飾子です。

しかしそのtruncateもマルチバイトに対応していないようで、日本語に適用すると切ったところが微妙に文字化けしたりする場合があるんですよね。そういうわけでマルチバイト対応のtruncateを作ってみました。

function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...')
{
  if ($length == 0)
    return '';
  if (mb_strlen($string,"UTF-8") > $length) {
    $string = mb_substr($string, 0, $length,"UTF-8");
    return $string.$etc;
  } else {
    return $string;
  }
}

下記ソースをmodifier.mb_truncate.phpと名前をつけて保存して、smartyのpluginsフォルダに置けばオッケーです。文字コードはUTF-8に指定しているので文字コードが異なる場合には変更が必要です。使い方は以下の通り。

[PHP]
$smarty->assign('text','広島カープにはぜひ頑張っていただきたいと思っている今日この頃です。');

[smarty]
{$text|mb_truncate:20}

[出力]
広島カープにはぜひ頑張っていただきたいと…

ちなみに単語の境界で切り取りを行うかどうかの、第3引数には対応していません。

このエントリーをはてなブックマークに追加