Help us understand the problem. What is going on with this article?

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

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

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

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

言語の判定

日本語がマルチバイトなため、日本語で「字数制限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の方がいいのかよくわかってない。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away