Blogブログ

smarty側で文字幅を取得、切り捨てる

こんにちは、サポート担当の大谷です。

本日はsmartyについてのお話です。

とあるページでの一部分で、ユーザーが設定した文言を100文字で切捨て、「…」をお尻につけて表示したい。
たまにあるやつです。
PHP側でやってしまってもよかったのですが、今回はsmarty側で対応したので、その事についてのお話です。

1.文字幅の取得

元々が指定範囲内に文字を収めたいという目的でしたので、
文字数の取得や切捨てやらでsmartyに備わっている関数を探してたのですが、
文字幅を取得できるって事で以下の関数を使用しました。

{$hoge|mb_strwidth}

 
$hogeで渡した変数の文字幅を、マルチバイト文字は2、シングルバイト文字は1で加算し、返してくれるというもの。
ええやんこれで。
100文字なのでsmarty内で以下のif文で分岐するようにしました。

{if {$hoge|mb_strwidth} > 100 }
    //100文字で切捨てて表示する処理
{else}
    //そのまま表示する処理
{/if}

2.文字を指定した幅で切捨てる

文字の切り捨ては以下の関数を使用しました。

{$hoge|mb_strimwidth:0:100}

$hogeで渡した変数を0文字目から文字幅100までで、切り捨てます。
下図では98文字までとして、「…」を追加しています。

{if {$hoge|mb_strwidth} > 98 }
    

{$hoge|mb_strimwidth:0:98}…

{else}

{$hoge}

{/if}

しかし、問題が1つ浮上しました。
HTMLで表示させた際、マルチバイト文字は文字の幅がきれいに揃っていますが、
シングルバイト文字だとそれぞれ幅がバラバラでズレてしまいます。
css側で等幅フォントにするなりしてないと、結局ズレるんかい・・・。

今回、実際の対応はそこまでキッチリという感じではなかったので、2文字分程度余裕を持たせる。という事で対応しました。

普段、あまりsmarty側では処理を記述する事はしないのですが、
今回は簡単な文字の加工程度の内容でしたので、smarty側で対応しました。

本来、プログラムとデザインを分離するという目的があって誕生したテンプレートエンジンなので、あまりsmarty側でごちゃごちゃとやるのはよろしくないですよね。
もう少し込み入った内容なら、PHP側で対応しましょう。
とかブーメラン的な事をほざいて、今回は終わりです。

ありがとうございました。

大谷

執筆者

Developer

大谷