目的
出来るだけサイズ制限ギリギリまで入力を許して,それをはみ出るタイミングで …
を末尾に付与したい。但し,それを付与してもサイズ制限を超過しないようにうまく計算する。
(例) あいうえお
→ 最大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;
}