ワードプレスはマルチバイトの文字コード(UTF8)を使っていることから、文字列の切り出しでは mb_substr() をよく使うと思います。

ただ日本語文字を全角1文字、英数記号を半角の0.5文字とカウントして文字列を取り出したい場合、mb_substr() では半角の英数記号でも日本語の全角文字でも1文字としてカウントするので、意図する文字数が切り出せない。

そこで全角半角を「幅」として見て、mb_strimwidth()を使うのが簡単にできて良さそうです。(文字数カウントだけなら mb_strwidth() !)

全角半角混在でも指定の文字数を切り出す

mb_strimwidth() は、半角を1文字全角を2文字として扱い、
文字列から指定の文字数を丸めて取り出します。

仕様的には以下のようになってます。

  • mb_strimwidth(
     ①文字列 ,
     ②開始位置,
     ③幅(文字数),
     ④最後につけるマーク,
     ⑤エンコード
    )

※)④、⑤は省略でもOK

関数リファレンス:mb_strimwidth

「丸めて」というのは、文字の途中までしか指定されない場合には(たとえば「あ」の半分までのデータが指定されたりすると文字として分からなくなることから)、その文字は取らず直前までを取得する(丸める)ということのようですね。

具体的な動作サンプル

例えば簡単な文字列として「12あい」と前半が半角数字2文字、
後半が日本語の平仮名2文字(全角2文字:つまり半角4文字分)の計半角6文字分の文字列があるとします。

$str = "12あい" とし、
この $str に対して、先頭(0)から1文字分、2文字分、3文字分など第三引数で指定して文字列を取り出してみると...

  • 1)mb_strimwidth( $str, 0, 1 ) → 1
    2)mb_strimwidth( $str, 0, 2 ) → 12
    3)mb_strimwidth( $str, 0, 3 ) → 12
    4)mb_strimwidth( $str, 0, 4 ) → 12あ
    5)mb_strimwidth( $str, 0, 5 ) → 12あ 
    6)mb_strimwidth( $str, 0, 6 ) → 12あい
    7)mb_strimwidth( $str, 0, 7 ) → 12あい
    8)mb_strimwidth( $str, 0, 8 ) → 12あい

1)では、先頭から(半角)1文字分なので「1」だけ。
2)では、先頭から(半角)2文字分なので「12」。
3)では、先頭から(半角)3文字分のところ、3文字目はあいにく全角文字(半角2文字分)の「あ」なので、その文字は取り切れず「12」のみが取り出される。(丸められた)

4)では先頭から(半角)4文字分を取り出すので「あ」まで取り切れて、
結果「12あ」が取得できた。

元の文字列 $str より多い切り取り文字数が指定される7),8)では、
文字列全体(12あい)のみが取り出されるってことになります。

半角を1文字、全角を2文字として数えるので、
日本語(全角)10文字分取り出したい場合には、2をかけて20を第三引数に指定すればよいことになりますね。

ワードプレスのブログによくある記事一覧では記事の抜粋表示がありますが、半角全角混在でも見た目の文字数の量を割ときっちりそろえたい場合に使えそう。

というわけで使って見た例が以下
【WordPress】記事一覧で抜粋の文字数を揃えたい!全角半角混在でも同じにする方法

注意するポイント:④ 第四引数

切り出した文字列の最後にマーク(文字列)を付加できるようになってますが(第4引数)、この付加するマークの文字列も切り出し文字数にカウントされるのが注意ポイント。

たとえば、$str = "12345あいうえお" (半角で15文字分の文字列)
最後に付加するマークを ' [...]' (半角スペース+半角5文字」の(半角)6文字分)として第四引数に指定してみると...

  • 1)mb_strimwidth( $str, 0, 1, ' [...]' ) → 12345あいうえお
    2)mb_strimwidth( $str, 0, 2, ' [...]' ) → 12345あいうえお
    3)mb_strimwidth( $str, 0, 3, ' [...]' ) → 12345あいうえお
    4)mb_strimwidth( $str, 0, 4, ' [...]' ) → 12345あいうえお
    5)mb_strimwidth( $str, 0, 5, ' [...]' ) → 12345あいうえお 
    6)mb_strimwidth( $str, 0, 6, ' [...]' ) → […]
    7)mb_strimwidth( $str, 0, 7, ' [...]' ) → 1 [...]
    8)mb_strimwidth( $str, 0, 8, ' [...]' ) → 12 [...]
    9)mb_strimwidth( $str, 0, 9, ' […]' ) → 123[…]
    10)mb_strimwidth( $str, 0, 10, ' […]' ) → 1234[…]
    11)mb_strimwidth( $str, 0, 11, ' […]' ) → 12345[…]
    12)mb_strimwidth( $str, 0, 12, ' […]' ) → 12345[…]
    13)mb_strimwidth( $str, 0, 13, ' […]' ) → 12345あ[…]
    14)mb_strimwidth( $str, 0, 14, ' […]' ) → 12345あ[…]
    15)mb_strimwidth( $str, 0, 15, ' […]' ) → 12345あいうえお
    16)mb_strimwidth( $str, 0, 16, ' […]' ) → 12345あいうえお
    17)mb_strimwidth( $str, 0, 17, ' […]' ) → 12345あいうえお

' […]' が半角6文字分あるので、1)から5)では' […]' も入りきらず、
結果としてすべての文字列が表示される、みたいになるようです。

6)からやっと付加するマークの文字列分が空いたのでマーク付きで文字列が取り出されます。

14)の時点では、まず14文字分が切り出されようとしますが、14文字目の全角「お」は半角足りずに切り出されず、結果として丸められて13文字分が切り出される。

そこに6文字分のマーク ' […]' を入れるので、
結果として切り出された文字は「12345あ[…]」(の13文字分)

15)では先頭から15文字分の切り出しですが、「12345あいうえお」の文字列が半角15文字分で全てが切り出され、切り出されてない文字はないため最後にマーク' […]'は付かない。

全角半角混在の文字数カウント

ちなみに、全角を1文字分、英数記号の半角を0.5文字分として文字数をカウントしたいだけなら mb_strwidth() が使えます。

関数リファレンス:mb_strwidth()

  • mb_strwidth( ①文字列, ②エンコード)

半角を1文字、全角を2文字として数えます。
(②のエンコードの指定は省略OK)

ワードプレス上で動作させてみても、たとえば以下のようになりますね。

  • 1)mb_strwidth( '12345' ) → 5
    2)mb_strwidth( 'あいうえお' ) → 10
    3)mb_strwidth( '12345あいうえお' ) → 15

UTF8で動作するワードプレスでも、こうした文字数カウントができれば、いろいろなところで活躍しそうですね。

UTF8で動作するワードプレスでも、こうした文字数カウントができれば、いろいろなところで活躍しそうですね。

では今回は以上!

早期退職して海外で奮闘する JIN のメールマガジン

時間や場所に縛られず稼いだJINが教える

~ 最短で月収10万円稼げるようになる方法 ~

お名前(全角文字)

隣のあの人にも、思わず教えたくなる秘密

配信停止は、いつでもできます

迷惑メールは一切配信されませんので、ご安心くださいね

自らの手で未来を変える力を手に入れる!