指定した数で文字列を丸める関数substr、mb_substr、mb_strimwidthの違い
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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
Smartyの Syntax Errorの原因はスペースかも
Smartyのなかなか原因がつかめない Syntax Errorの原因はスペースかもしれません。
-
-
ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説
ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。
-
-
ECCUBEの問い合わせフォームに任意の値を引数として渡す方法
ECCUBEのお問い合わせフォームに値を固有の情報を送りそれに基づいて処理をする方法を解説。ボタンの設置、受け取り側のテンプレート、プログラムのサンプルソースを提供。
-
-
ファイル変更だけ!ECCUBEの本番から開発環境をコピーする手順を解説
ECCUBEを本番から開発環境をコピーする際の手順を解説。PGMメンテに必要な開発環境を構築する手順を解説。ECCUBEの仕組みは簡単なので作業は5分ほど。
-
-
数値文字参照コード変換ツール(HTML特殊文字コード変換ツール)
テキストを数値文字参照コード(特殊文字コード)に変換するツール。テキストを数値文字参照コードに簡単変換。数値文字参照、文字実体参照、特殊文字などの違いも解説。
-
-
include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由
include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。
-
-
Smartyの修飾子regex_replaceで正規表現の後方参照・PHPではpreg_replace
ECCUBEで使われているSmartyで文字列を正規表現で置換し後方参照で値を利用する装飾子regex_replaceの解説です。細かな条件がありますので注意が必要です。
-
-
PHP range関数を使って階乗と重複組み合わせを計算
PHPの range関数を使って階乗と重複組み合わせを計算し、それを元に乱数発生器を作成しました。
-
-
PHPで正規表現の検証には preg_match_allが便利
PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。
-
-
SEO対策用タイトル、ディスクリプションの文字数カウントツール
SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。