指定した数で文字列を丸める(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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
AdminerはphpMyAdmin代替のデータベース管理ツール
AdminerはphpMyAdminとほぼ同機能のデータベース管理ツール。PHP 1ファイルのため設置が非常に簡単で軽快に動作し、phpMyAdminの置き換えで使うのも問題なし。
-
SEO対策用タイトル、ディスクリプションの文字数カウントツール
SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。
-
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。
-
連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズする関数の作成解説
PHPの配列・連想配列のキーと値をまとめてhtmlspecialchars()関数でサニタイズ(無害化、無毒化)を行う関数を作成。連想配列のキーはarray_map()関数でのサニタイズは無理。
-
ECCUBEの管理画面のSSL設定をインストール後に変更する方法
ECCUBEをインストールした後から管理画面のSSL設定を変更する方法を解説します。config.phpファイルのHTTPS_URLとADMIN_FORCE_SSLの値を変更すればOK。
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
-
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。
-
ECCUBE mtb_constants initパラメータ設定の項目を追加する方法
ECCUBEのパラメータ設定で設定できる項目を追加する方法を説明します。
-
路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索
路線・駅検索の仕組みの構築は大変。登録する側も最寄り駅が多い場合は大変。なので簡易に実装するため緯度経度に基づき直線距離を計算する処理を考案して実装して、その処理を解説。
-
Smartyの修飾子regex_replaceで正規表現の後方参照・PHPではpreg_replace
ECCUBEで使われているSmartyで文字列を正規表現で置換し後方参照で値を利用する装飾子regex_replaceの解説です。細かな条件がありますので注意が必要です。