プログラミングノート

プログラミングの備忘録です

PHP CSS 表示枠からはみ出した文字列を省略して表示する

表示枠からはみ出した文字列を省略して表示します。文字列は全角文字と半角文字が混在しているとします。

(たまに同じような処理を書きますが、いつもいつも忘れてしまいます。今回はメモを残します。)

 

1.使用するPHPのマルチバイト文字列関数

下の2つの関数のパラメータで、エンコーディングを指定することが大切です。

 

▼mb_strwidth

「文字列 str の幅を返します。マルチバイト文字は、通常はシングルバイト文字の倍の幅となります。」(PHP: mb_strwidth - Manual より引用)

 

▼mb_substr

「文字数に基づきマルチバイト対応の substr() 処理を行います。位置は、 str の始めから数えられます。 最初の文字の位置は 0、2 番目の文字の位置は 1、といったようになります。」(PHP: mb_substr - Manual より引用)

 

 

2.手順

  1. 表示枠(divタグ内)に最大何文字のシングルバイト文字が表示できるか調べます。
  2. シングルバイト文字の最大文字数を文字列の最大幅とします。
  3. 文字列の幅が最大幅より大きい場合、後ろから1文字削ります。
  4. 1文字削った文字列の幅を最大幅と比較します。
  5. 文字列の幅が最大幅より小さくなるまで繰り返します。
  6. 最後に省略マーク「...」をつけます。

 

3.サンプルソース

下の例では、$text の最大幅を12としています。

$n = 0;
while (mb_strwidth($text, mb_internal_encoding()) > 12) {
    $label_text = mb_substr($text, 0, 12-$n, mb_internal_encoding());
    $n++;

}
if ($n > 0) {
    $text .= '...';
}

 

4.cssで

CSSで、表示枠からはみだした文字列を省略して表示することができます。

表示枠が1行の場合に使えます。

 

手順

表示枠のブロック要素(divタグ、pタグなど)に下のプロパティを付けます。

▼ width 表示枠の幅
▼ overflow "visible" 以外のものを指定
▼ white-space: nowrap;

(IE, WebKit (Safari, Chrome), Firefox 7, Opera 11)
▼ text-overflow: ellipsis;

(Opera 9-10)
-o-text-overflow: ellipsis;

div .test {
width: 60%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
}

 

参照

PHP: マルチバイト文字列 関数 - Manual

text-overflow - CSS | MDN

CSSではみ出した文字を省略する「text-overflow: ellipsis;」がいつの間にかPCでも使えるようになってた! - tacamy.blog