Laravel5.3 str_limitにご用心

laravel.com

Laravelのヘルパー関数って便利なものがいっぱいありますよね。

特に str_limit という関数が素敵に感じました。
文字列を指定した数値で切り詰める関数です。
ですが、日本語で使うときは要注意です。

例えば、12いちにー という文字列に str_limit を使用してみましょう。

長さ 理想 現実
1 1 1
2 12 12
3 12い 12
4 12いち 12い
5 12いちに 12い
6 12いちにー 12いち

どうやらマルチバイトの文字列でこけるようです。

なぜそのようなことが起こるか調べてみたところ、str_limitは文字でなく、文字で切り詰めるようになっていました。

<?php
    public static function limit($value, $limit = 100, $end = '...')
    {
        if (mb_strwidth($value, 'UTF-8') <= $limit) {
            return $value;
        }
        return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end;
    }

文字幅で切り詰めるケースは日本では無さそうなので、文字数で切り詰める関数を自作したほうがよさそうです。

こんな感じでしょうか。

<?php
    public static function str_limit($value, $limit = 100, $end = '...')
    {
        if (mb_strlen($value, 'UTF-8') <= $limit) {
            return $value;
        }
        return rtrim(mb_substr($value, 0, $limit, 'UTF-8')).$end;
    }