はじめに
PHPのtrim()
関数は、文字列の先頭と末尾から指定した文字を削除する便利な関数です。ただし、UTF-8などマルチバイト文字列を扱う場合には思わぬ落とし穴があります。本記事では試験で狙われやすい基本仕様と、実務で注意すべきマルチバイト時の挙動について解説します。
目次
基本仕様(教科書的な動作)
trim(string $string, string $characters = " \n\r\t\v\x00"): string
- デフォルトでは空白・改行・タブなどを削除する。
- 第二引数
$characters
で削除対象文字を指定できる。
ソースコード例1
<?php
declare(strict_types=1);
error_reporting(-1);
$s = 'あいういあ';
var_dump(trim($s, 'あ'));
理想的な説明:
- 先頭と末尾の「あ」が削除されて →
"いうい"
- UTF-8では「あ」「い」「う」1文字が3バイトなので →
string(9) "いうい"
実際の挙動(UTF-8での落とし穴)
実際に上記コードを実行すると、結果は次のようになります。
string(7) "�うい"
なぜでしょうか?
- 「あ」=
E3 81 82
(UTF-8で3バイト) - 第二引数
'あ'
は「E3, 81, 82 の各バイト」を削除対象にする - そのため、先頭と末尾の「あ」は消えるが、中央の「い」(
E3 81 84
)の先頭バイトE3
も削られ、結果的に文字化けする
ポイント:trim()
は「文字」ではなく「バイト集合」として判定を行うため、マルチバイト文字を扱うと文字化けが起こりやすいのです。
安全な代替方法
マルチバイト文字を正しく扱いたい場合は、mbstring
や正規表現を利用します。
ソースコード例2(正規表現で両端の「あ」を削除)
<?php
declare(strict_types=1);
error_reporting(-1);
$s = 'あいういあ';
$result = preg_replace('/^(あ)+|(あ)+$/u', '', $s);
var_dump($result); // string(9) "いうい"
この方法なら、期待通り「いうい」が得られます。
試験対策のポイント
trim()
の第二引数は「文字集合」ではなく「バイト集合」扱い- マルチバイト文字を渡すと意図しない動作(文字化け)が起こり得る
- 試験では「両端の指定文字を削除する」という基本動作を押さえつつ、実務ではマルチバイト非対応に注意
まとめ
trim()
は便利だが、マルチバイト文字を含む場合は挙動に注意- 教科書的には「両端の指定文字を削除」だが、実際には「バイト単位処理」
- 日本語などマルチバイトを扱う場合は
mbstring
やpreg_replace
を利用することが推奨される