phpのsubstr関数の使い方や日本語の文字化けの対処法、文字数の指定方法などの解説

今回は、phpのsubstrについて学んだので、備忘録としてまとめていきます。

phpのsbustr関数の基本

substr関数は、指定した文字列の一部分だけ抜き取ってくれる関数となる。

参考:PHP: substr – Manual

例えば、substrには以下のような使い方がある。

<?php
$str = 'I am tarou';
$sub = substr($str, 2);
print $sub . PHP_EOL;  // am tarou
?>

上記の様にsubstr($str, 2)と指定してあげることで、指定した文字列の2byte目の文字から後の文字列を取り出してくれる。

substrは下記の様に、第3引数も指定してあげることで「2byte目から6byte目までの部分文字列を取り出す」と言うこともできる。

<?php
$str = 'I am tarou';
$sub = substr($str, 2, 6);
?>

また、引数の整数をマイナスにすることで「後ろから何byte目」と言う感じで指定できるし、第2,3引数を文字列にしても型変換をしてくれるので普通に動く。

ただ直接引数に整数を指定してあげるケースは稀で、個人的には文字列の長さを取得するstrlen関数と組み合わせて使う事が多い。

参考:PHP: strlen – Manual

substrで日本語が文字化けしてしまう原因と対策

substr関数で日本語の部分文字列を取り出そうとすると、以下の様に文字化けが発生する時がある。

<?php
$str = '私はたろうです';
$sub = substr($str, 2);
print $sub . PHP_EOL; // �はたろうです
?>

これはsubstrbyte数によって文字を分ける関数であるのが原因で起こるものだ。

ローマ字だと1byteで1文字を表現することができるが、日本語は2byteや3byteで文字を表現する「マルチバイト文字」なので、上記の例の様に3byteで表現された「私」と言う文字があるのにも関わらず2byte目から取り出そうとしているので、文字化けが発生してしまう。

対策法

対策法としては、mb_substrを使うのが良い。この関数は、マルチバイトに対応してsubstrと考えてよい。

参考:PHP: mb_substr – Manual

ReratedPosts

phpの__autoload関数とかspl_autoload_registerについて理解したのでまとめておく
PHPのin_arrayの第3引数にはtrueを使う方が良いという話
phpの開発環境用のローカルサーバーはビルトインウェブサーバーを使うと良い
CentOS7にphpbrewとphpを入れてPHPの開発環境を構築する方法
Ubuntu18.04.1にphpbrew+php7.2+apache2+MySQL5.7の開発環境を整える方法
PHPでスクレイピングの高速化にはfile_get_contensよりもcurlの方が良いよって話