PHP 全角半角文字が混ざった文字数制限する方法

やりたいこと

全角半角が混ざった文章で、全角を2文字 半角を1文字と数えて出来るだけ文章の表示横幅をそろえる

CSSだと


overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;

を使えばいいやつです。ここはあえてPHPで

ControlBoxのトップページにあるTOPICSは2件目以降 BOXを横並びにしていますが、このタイトルが長いと縦が綺麗に並ばないのでレイアウトが崩れてしまう事があります。

 

こんな風にしたい

これを回避するのには、一番高いBOXに他のBOXも合わせるか 文字数が一定の数を超えないように文字数を制限するか?でレイアウトが崩れません。

今回は、タイトル文字数を制限して表示したいと思います。しかし、全角半角をそれぞれ1文字と数えてしまっては同じ文字数でも大きな差が出てしまいます。

やり方

mb_strimwidth関数は半角を1文字全角を2文字として計算しますので”それなりに”きれいに揃います。ただ、これは”それなりに”きれいになるだけで、完全に桁を揃えることは出来ません。理由としては、表示時の文字の幅はフォントに依存してしまうためです。単純に半角1文字、全角2文字で計算しても、きちんと揃わない場合があります。

出力結果

よくある間違い

mb_substrを使った場合、半角英数も全角文字も1文字として扱われてしまうため、単純に文字列を切り取ってしまうと、長さがきれいに揃いません。

ので、横幅を出来るだけ合わせたい場合は mb_strimwidthを使いましょう。

その他

その他も横幅が指定した幅を超えたら、1文字削るをループチェック実行して 超えない状態になったら「...」をつけるという処理もあります。

その解説はまた今度