PHPで文の中間を省略して一定の幅に収める

「文の中間を省略して一定の幅に収める」処理は需要がありそうですが、検索してみた限りでは見つからなかったので作ってみました。

PHPには、文字列が一定の長さ(幅)を超えたら丸める関数 mb_strimwidth()が標準で有ります。しかし、この関数だけでは文字列の中間を省略する事はできませんので、この関数を応用して、一定の幅を超えたら指定位置の文字列を省略する関数にしました。少し長いですが、ソースコードは下記の通りです。

<?php
// 文字列の途中を省略して最大幅以内にする
// string $str        = 対象文字列
// int    $maxWidth   = 最大幅 (mb_strwidth準拠)
// int    $cutPos     = 省略位置。正の値は先頭から(0が先頭)、負の値は末尾からの幅。Falseで中央。
// string $trimMarker = 省略記号にする文字列
// @return string
function sMidTrim ($str, $maxWidth, $cutPos = False, $trimMarker = '..') {

    // 文字列の幅を取得
    $strWidth = mb_strwidth($str);
    if($strWidth <= $maxWidth) { return $str; }

    // マーカーの幅を取得
    $tmWidth = mb_strwidth($trimMarker);
    if($tmWidth + 2 > $maxWidth) { return $str; }

    // カットすべき幅を算出
    $cutoffWidth = $tmWidth + $strWidth - $maxWidth;

    // カットの始点(幅)を算出
    $remain = $strWidth - $cutoffWidth;
    if(!is_int($cutPos)) {
        // 無指定時は中央
        $cutBeginWidth = ceil( $remain / 2 );
    }
    elseif($cutPos >= 0) {
        // 正の値
        if($cutPos > $remain) { $cutPos = $remain; }
        $cutBeginWidth = $cutPos;
    }
    else {
        // 負の値
        $cutBeginWidth = $remain + $cutPos;
        if(0 > $cutBeginWidth) { $cutBeginWidth = 0; }
    }

    // 先頭文字列を切り出す
    $headStr = mb_strimwidth($str, 0, $cutBeginWidth);

    // 末尾文字列を切り出す
    $pos = mb_strlen( mb_strimwidth($str, 0, $cutBeginWidth + $cutoffWidth) );
    $tailStr = mb_substr($str, $pos);

    return $headStr.$trimMarker.$tailStr;
}

解説

出来る限りソースコードのみで解るように書いたつもりですが、いくつか補足します。

引数のうち、第2及び第3引数は「幅」単位で指定するようになっています。 これはmb_strimwidth()で使われる幅と同じものです。

第3引数で指定された位置に省略記号(第4引数で指定可)が挿入されます。 なお、末尾に省略記号を付ける動作はmb_strimwidth()で可能ですので省きました。

第1引数で渡された文字列が第2引数の幅に満たない場合は、何も処理を行わず文字列をそのまま返します。 省略記号が付加されるのは、省略しないと指定された幅に収まらない場合のみです。

関連記事 PHPのmb_strimwidthが意図通り動かない問題

利用時の注意

PHP5.6で動作確認しました。PHP5以降であれば恐らく動くと思います。

マルチバイト文字列関数(mb_*)を呼び出していますので、実際の挙動はそれらの関数に依存します。 予めmb_internal_encoding()で適切な内部文字エンコーディングを設定してからご利用ください。

コードは非商用に限り、そのままご利用頂いても構いません。
適切に動作するよう心がけましたが、不具合があるかもしれません。無保証ですのでその点はご了承願います。利用やバグ等の報告は頂ければ嬉しいです。

テーマ: プログラミング - ジャンル: コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://itpc.blog87.fc2.com/tb.php/181-b38c48aa
この記事にトラックバック(FC2ブログユーザ用)