指定した長さで文字列を丸めるPHPの関数 mb_strimlen を作ったよ

PHP には指定した幅で文字列を丸めてくれる mb_strimwidth という関数がありますね。

動作はこんな感じ。

echo mb_strimwidth("はいこんにちは!", 0, 12, "...");
// はいこんに...

指定した幅で文字列を丸めて、末尾が切れるときはマーカー(上例の “…” の部分)で埋めてくれるやつ。

マーカーも含めた幅を計算してくれるのでいろんな文字列のおおよその横幅をそろえるのに使うもの、ということでいいですか。

ところでこの関数は文字数でもなくバイト数でもなく「幅」を対象にするんだけど、これは大雑把に言って「シングルバイトは1、マルチバイトは2」と数えるみたい。等幅フォントなんかでの画面表示を想定してるんじゃないかな。

そのため、幅ではなくて純粋に文字数で切りたい時には使えない。Twitter や MySQL は幅でもなくバイト数でもなく文字数で考えるのでそういうときには使えませんね。

単純に140文字で切るだけなら

$str = mb_substr($str, 0, 140);

でいいんだけど、末尾が切れるときは「…」を付けたいという場合もあるので mb_strimwidth のようなことを幅ではなく文字数でやってくれる関数を作りました。

width じゃなくて length で数えるから mb_strimlen

<?php
function mb_strimlen($str, $start, $length, $trimmarker = '', $encoding = false) {
    $encoding = $encoding ? $encoding : mb_internal_encoding();
    $str = mb_substr($str, $start, mb_strlen($str), $encoding);
    if (mb_strlen($str, $encoding) > $length) {
        $markerlen = mb_strlen($trimmarker, $encoding);
        $str = mb_substr($str, 0, $length - $markerlen, $encoding) . $trimmarker;
    }
    return $str;
}

4行目にある mb_substr の第3引数を無指定にするのに null でいけたらいいんだけど、残念ながら null にすると 0 と解釈されてしまうので、とりあえず mb_strlen($str) で。

やりたいことの意味で考えたら mb_strlen($str) - $start かなと思うんだけどもういいですこれで。

特に Twitter 関係のサービスではよくこういうのを使いそうなので書いてみました。

「いやその関数もうあるよ」とか「もっと賢い方法あるよ」という場合は教えてください。

もうあったらショッキングだけど。

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