LoginSignup
24
16

More than 5 years have passed since last update.

PHPで文字列を丸める処理3パターン「文字幅」「文字数」「バイト数」

Last updated at Posted at 2018-05-23

目的

出来るだけサイズ制限ギリギリまで入力を許して,それをはみ出るタイミングで を末尾に付与したい。但し,それを付与してもサイズ制限を超過しないようにうまく計算する。

(例) あいうえお → 最大4文字までで丸める → あいう…

最大文字幅 $width までで丸める

素直にそのまま使うだけ。但し a が 幅1 で が 幅2 なのに 👪 が幅1 だったりするので謎。見た目の用途だと基本CSS使うのであんまり出番はないかも。

(関連)mb_strimwidth関数なんて必要なかった(?) - Qiita

最大文字数 $length までで丸める

素直にこのあたり使うだけ。

function truncate(string $input, int $length = -1, string $trimMarker = '…'): string
{
    // 無制限またはサイズ内
    if ($length < 0 || mb_strlen($input, 'UTF-8') <= $length) {
        return $input;
    }

    // $trimMarker だけで $length を超えている
    if (mb_strlen($trimMarker, 'UTF-8') > $length) {
        return '';
    }

    return mb_substr($input, 0, $length - mb_strlen($trimMarker, 'UTF-8')) . $trimMarker;
}

最大バイト数 $capacity までで丸める

知らない人も多いであろうマイナー関数。自分も今日久々に思い出しました。最大ペイロード長がバイト数で制限されているときとかに超便利。

function truncate(string $input, int $capacity = -1, string $trimMarker = '…'): string
{
    // 無制限またはサイズ内
    if ($capacity < 0 || strlen($input) <= $capacity) {
        return $input;
    }

    // $trimMarker だけで $capacity を超えている
    if (strlen($trimMarker) > $capacity) {
        return '';
    }

    return mb_strcut($input, 0, $capacity - strlen($trimMarker)) . $trimMarker;
}
24
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
16