1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

(多言語対応)PHPで記事のタイトルを指定の字数超えたら...表示にする

Posted at

使う機会多そうだなーと思ったので自分用メモ。

やりたいこと:記事一覧の箇所で、タイトルが全文表示されてしまって見栄えが悪いので、字数を制限して、字数以降は...を表示したい。

考慮する点:サイトが多言語なため、日本語以外にも対応する必要あり。

言語の判定

日本語がマルチバイトなため、日本語で「字数制限30字」とかの制限をつけると、英語のタイトルの場合60字とかになる。

そのため、日本語かそうではないか(正しくはマルチバイト文字かそうでないか)の判定がまず必要。

判定に使うのは

・mb_strlen
・mb_strwidth

の二つ。

mb_strlenは文字列のバイト数を出力し、mb_strwidthは文字の幅(文字数)を出力するので、全角文字が文字列に含まれていた場合は両方の値が一致し、また半角しかない場合は一致する。

よって、

if(mb_strlen($title,'utf8') != mb_strwidth($title,'utf8')){
        //マルチバイトの場合の処理
} else {
        //それ以外の場合の処理
}

上記のようにする。

字数の設定と...の追加

ここは、先ほどのmb_strwidthで字数を数えて、振り分ける。
もしも字数を超えてた場合は、mb_substrで字数までの文字列にする。
その後...を追加。

$number = 30 //ここに字数を入れる
if(mb_strwidth($title) > $number){
         $title = mb_substr($title,0,$number);
         $title = $title . '...';
}

英語も字数を変えるだけで対応可能なので、最終的に全コードは、

$number = 30 //ここに字数を入れる
$number_single = 60 //日本語以外の文字数

if(mb_strlen($title,'utf8') != mb_strwidth($title,'utf8')){
        if(mb_strwidth($title) > $number){
         $title = mb_substr($title,0,$number);
         $title = $title . '...';
        }
} else {
        if(mb_strwidth($title) > $number_single){
         $title = mb_substr($title,0,$number_single);
         $title = $title . '...';
        }
}

になる。

その他考慮できる点

マルチバイトの処理で使った、mb_substrを英語の場合でも使っているが、substrでも問題ないのか、そもそもsubstrの方がいいのかよくわかってない。

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?