エス技研

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


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

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

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のポイント設定、ポイント付与率を一括で変更する方法解説

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

数値文字参照コード変換ツール(HTML特殊文字コード変換ツール)

テキストを数値文字参照コード(特殊文字コード)に変換するツール。テキストを数値文字参照コードに簡単変換。数値文字参照、文字実体参照、特殊文字などの違いも解説。

Smartyのテンプレート内の処理で計算、加工をする方法

Smartyのテンプレート上で変数を計算する、加工する方法を解説します。

路線・駅検索のために緯度経度からPHPで簡易的に距離を計算する処理解説
路線・駅検索のために緯度経度からPHPで2点間の距離を計算する処理解説

路線・駅検索の仕組みの構築は大変。それを簡易に実装するために緯度経度を元に距離計算をする仕組みを考案。まずは2点間の距離を計算する仕組みを解説し、距離計算にまつわる関連技術も紹介。

PHPパーミッション変更のchmod関数・モードを変数で指定する方法

パーミッション変更関数であるchmod関数の第二引数、ファイルモードの指定に変数を使う場合は8進数に変換するoctdec関数を使って変換します。

PHPで特定の日間の日付を for、strtotimeで表示する

ある特定の間の日付の情報を for文、strtotimeを使って作成し、その解説をしています。

パーミッション(属性)一括変更ツール・WordPress最適化済

WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。

include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由

include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。

XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()

XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。

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

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