エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


指定した数で文字列を丸める(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関数は、具体的に下記の様に利用します。
 

 
 
これらはよく似た動きをする関数なのですが、必須となるパラメータや、パラメータの順番などが違っていることはもちろんのこと、処理の内容も少しずつ違っていますので、これをしっかり把握していないと望んでいる結果にならない場合もあります。
 
使う前に今一度仕様を確認しておきましょう。
 
 

substr()関数

 
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()関数は、下記の様に記述します。
 

 
mb_substr()関数の「文字数」は、文字通り文字数でカウントします。
半角も全角も 1文字は 1文字としてカウントします。
 
ただし、正しく文字コードが認識されたとき、という条件が付きます。
 
正しく文字コードを処理できない場合は、「substr()関数」と同じバイト数で処理しますので、最後の文字が文字化けする場合があります。
 
たまたま文字コードが正しく認識されたときはいいですが、環境が変わった場合でも正しく動作させるために、パラメータの 4項目目の「エンコーディング」は必ず指定するようにしておくべきです。
 
詳細は、PHPマニュアルにて
http://php.net/manual/ja/function.mb-substr.php
 
 

mb_strimwidth()関数

 
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

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

ECCUBEでアップロードできない。upload_max_filesizeを設定する場所

テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。

PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法

PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!

GMOペイメントゲートウェイのjava.io.IOExceptionのエラー

ECCUBEの決済でGMOペイメントゲートウェイのモジュールを使ってテスト決済を行った場合の不具合、java.io.IOExceptionと言うエラーの原因と対策方法の解説です。

PHPで正規表現の検証には preg_match_allが便利

PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。

Basic認証の.htaccess、.htpasswd生成ツールと解説

Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。

ECCUBEの問い合わせフォームに任意の値を引数として渡す方法

ECCUBEのお問い合わせフォームに値を固有の情報を送りそれに基づいて処理をする方法を解説。ボタンの設置、受け取り側のテンプレート、プログラムのサンプルソースを提供。

ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説

ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!

数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!

PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。

ECCUBEでテンプレートファイルのファイルサイズは10MB以下のものを使用してくださいのエラーが出た場合

テンプレートをアップロードする際にファイルサイズが大きすぎてエラーが表示される際の対処方法解説。パラメータ設定で設定する制限について解説を行っています。

リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α

リダイレクトループ、自動転送設定ループの原因の解説とその対応方法を含め事例 12例を挙げて説明。