使う機会多そうだなーと思ったので自分用メモ。
やりたいこと:記事一覧の箇所で、タイトルが全文表示されてしまって見栄えが悪いので、字数を制限して、字数以降は...を表示したい。
考慮する点:サイトが多言語なため、日本語以外にも対応する必要あり。
言語の判定
日本語がマルチバイトなため、日本語で「字数制限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の方がいいのかよくわかってない。