指定した数で文字列を丸める(n文字目で…にする)関数substr、mb_substr、mb_strimwidthの違い
2019/03/30
PHPで指定した文字数で文字列を丸める関数の使い方と動作の違い
Webサイトを構築する際に活躍する関数 substr、mb_substr、mb_strimwidthの使い方とその機能の違い
Webサイトを構築する際、「この段落の文字数は最大 50文字まで表示するようにしてください。50文字を超えた部分は『...』にしておいてください。」なんて言う指示を受けることがよくあります。
一覧ページ、一覧表などで編集される文字数が多くなると、全体的なバランスが崩れる場合があります。
そのような事態を防ぐため、ある一定数以上の文字数の場合は、途中までしか表示しないようにする、という対応です。
そして、このように指定した文字数で文字列を丸める処理を行う PHPの関数は以下のものがあります。
- substr
- mb_substr
- mb_strimwidth
substr、mb_substr、mb_strimwidth関数は、具体的に下記の様に利用します。
1 2 3 4 5 6 7 8 9 10 |
$mbstrin = "あいうえおabcdeかきくけこ"; $mbstrout1 = substr ( $mbstrin, 0, 6 ); $mbstrout2 = mb_substr ( $mbstrin, 0, 6, "utf-8" ); $mbstrout3 = mb_strimwidth ( $mbstrin, 0, 6, "...", "utf-8" ); echo $mbstrin . "<br>"; echo $mbstrout1 . "<br>"; echo $mbstrout2 . "<br>"; echo $mbstrout3 . "<br>"; |
これらはよく似た動きをする関数なのですが、必須となるパラメータや、パラメータの順番などが違っていることはもちろんのこと、処理の内容も少しずつ違っていますので、これをしっかり把握していないと望んでいる結果にならない場合もあります。
使う前に今一度仕様を確認しておきましょう。
substr()関数
substr()関数は、下記の様に記述します。
1 |
substr ( 入力文字列, 開始場所 [, 文字数 ] ); |
substr()関数の「文字数」は、「バイト数」でカウントします。
そのため、半角文字は 1文字 1バイト、全角文字は 1文字 2バイト~4バイトとなります。
全角文字のバイト数が合わない場合(例えば「あ」に対して「1バイト」を指定した場合)は、最後の文字が文字化けします。
全角文字は、Shift-Jis、EUCなどの文字コードでは 2バイトでしたが、UTF-8の文字コードでは 3バイト、4バイトの文字が存在します。
文字コードによってバイト数が違いますので、全角文字が使われる可能性がある変数の文字数を処理する場合には向かない関数と言えます。
全角文字のバイト数に関しては下記に記事を書いていますので、あわせて参考にしてください。
日本語は2バイト文字?3バイト文字?
また、「開始場所」に負の値を入力すると、文字列の最後からの文字数となります。
「文字数」を省略すると、文字列の最後までが指定されたものとみなされます。
詳細は、PHPマニュアルにて
http://php.net/manual/ja/function.substr.php
mb_substr()関数
mb_substr()関数は、下記の様に記述します。
1 |
mb_substr ( 入力文字列, 開始場所 [, 文字数 [, エンコーディング ] ] ); |
mb_substr()関数の「文字数」は、文字通り文字数でカウントします。
半角も全角も 1文字は 1文字としてカウントします。
ただし、正しく文字コードが認識されたとき、という条件が付きます。
正しく文字コードを処理できない場合は、「substr()関数」と同じバイト数で処理しますので、最後の文字が文字化けする場合があります。
たまたま文字コードが正しく認識されたときはいいですが、環境が変わった場合でも正しく動作させるために、パラメータの 4項目目の「エンコーディング」は必ず指定するようにしておくべきです。
詳細は、PHPマニュアルにて
http://php.net/manual/ja/function.mb-substr.php
mb_strimwidth()関数
mb_strimwidth()関数は、下記の様に記述します。
1 |
mb_strimwidth ( 入力文字列, 開始場所, 文字数 [, 丸めたときに追加される文字列 [, エンコーディング ] ] ); |
mb_strimwidth()関数の「文字数」は、半角と全角で長さが変わります。
半角文字は 1文字 1文字、全角文字は 1文字 2文字となります。バイト数とも違いますので、注意が必要です。
ただし、これも、正しく文字コードが認識されたとき、という条件が付きます。
正しく文字コードを処理できない場合は、「substr()関数」と同じバイト数で処理しますので、最後の文字が文字化けする場合があります。
そのため、環境が変わった場合でも正しく動作させるため、パラメータの 4項目目の「エンコーディング」は必ず指定するようにしましょう。
4項目目のパラメータ「エンコーディング」を指定している場合は、全角文字の文字数が合わない場合でも文字化けはしませんので安心です。
例えば「あ」に対して「1文字」を指定した場合は、表示されません。(「2文字」を指定した場合にのみ表示されます。)
また、「mb_strimwidth()関数」の特徴としては、「丸めたときに追加される文字列」を指定できる点です。
Webサイトを作る際によくある、「50文字以上ある場合は 50文字まで表示して、文章を省略した場合は最後は『...』を追加してほしい」という要望があるかと思いますが、その場合「mb_strimwidth()関数」を使うと簡単に実装できてしまいます。
文章を省略していない場合は「...」は表示されませんので、制限の文字数に達したか、達していないかを自分で分岐処理を作る必要がありません。
ただし、1点注意点としては、「...」も含めて文字数としてカウントされている、ということです。
具体的には、「10文字」と指定した場合は「あいう...
」となります。「
あいうえお...
」ではありません。
詳細は、PHPマニュアルにて
http://php.net/manual/ja/function.mb-strimwidth.php
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
PHPのソースで見慣れない記号が出てきた・アロー演算子(->)、ダブルアロー演算子(=>)
PHPのプログラムソースには見慣れない記号が出てきます。その意味や調べ方です。
-
PHPで特定の日間の日付を for、strtotimeで表示する
ある特定の間の日付の情報を for文、strtotimeを使って作成し、その解説をしています。
-
ECCUBE2.13.3で商品規格の在庫数が無制限から変更できないバグがある
2.13.3固有のバグである商品規格の在庫数の入力エリアがアクティブにならない不具合を解消する解説です。product_class.tplの2行を修正するだけの簡単対応です。
-
ECCUBEの問い合わせフォームに任意の値を引数として渡す方法
ECCUBEのお問い合わせフォームに値を固有の情報を送りそれに基づいて処理をする方法を解説。ボタンの設置、受け取り側のテンプレート、プログラムのサンプルソースを提供。
-
Basic認証の.htaccess、.htpasswd生成ツールと解説
Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。
-
サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない
PHPでショートタグを使うのは危険。サーバ移転やバージョンアップで動かなくなる!ソースが丸見え、設定情報流出のリスクが!php.iniのshort_open_tagの設定を再確認。
-
PHP range関数を使って階乗と重複組み合わせを計算
PHPの range関数を使って階乗と重複組み合わせを計算し、それを元に乱数発生器を作成しました。
-
cURLを利用する際の注意点「
&
」があるURLは「”
」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。
-
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。
-
ECCUBEの新規追加ページがInternal Server Error・Not Foundに
ECCUBEで新規追加したページがInternal Server Errorに!原因はファイルのパーミッションの場合が多くその対処方法とプログラムの修正ポイントを解説。Not Foundも解説。