trim/ltrim/rtrimの第2引数を使いこなす
trim とは、文字列の前後から不要な文字を削る関数です。既定では空白や改行を落としますが、第2引数を指定すれば任意の文字も対象にできます。
デフォルトで消える文字
trim は前後の空白を落とす関数、という理解で使っている人が多いと思いますが、実は消しているのは空白だけではありません。デフォルトではスペース、タブ、改行(\n \r)、ヌル文字、垂直タブが対象です。フォーム入力の整形で改行まで落ちるのは、この仕様のおかげですね。
$input = " hello\n";
echo '[' . trim($input) . ']';
// [hello] 末尾の改行も消える
第2引数で消す文字を指定する
本題はここです。第2引数に文字リストを渡すと、その文字だけを前後から削ります。空白ではなく特定の記号を落としたいときに効きます。渡した文字は「集合」として扱われ、順不同でその中のどれかが端にある限り削られ続けます。
// 末尾のスラッシュを落とす
echo rtrim('/path/to/dir/', '/');
// "/path/to/dir"
// 前後の記号をまとめて除去
echo trim('***重要***', '*');
// "重要"
// 複数文字を指定(どれでも端にあれば削る)
echo trim('[](){}中身', '[](){}');
// "中身"
URL の末尾スラッシュ調整や、囲み記号の除去でよく使います。指定した文字を「連続して」削るので、’*’ を渡せば端の * がなくなるまで削られる点は意識しておきたいところです。
範囲指定とltrim/rtrimの使い分け
第2引数では "a..z" のように二つのドットで文字範囲を指定できます。連番的な文字をまとめて対象にしたいときに便利です。また、前だけ・後ろだけを削りたいなら ltrim(左)と rtrim(右)を使い分けます。前ゼロを落とす処理などは ltrim の出番ですね。
// 範囲指定: 前後の英小文字を削る
echo trim('abc123abc', 'a..z');
// "123"
// 前ゼロだけ落とす(ただし "0" 自体が消える罠に注意)
echo ltrim('00042', '0');
// "42"
echo ltrim('0000', '0');
// "" 全部ゼロだと空になる
ltrim で前ゼロを落とすのはよくやりますが、値が “0000” のときに空文字になってしまうのは地味な罠です。数値として扱うなら素直にキャストしたほうが安全な場面も多いと思います。
まとめ
trim 系は「空白除去」以上の使い道があって、第2引数を知っていると記号の除去や範囲指定がぐっと楽になります。指定文字は端から連続で削られること、前ゼロ落としで全ゼロが空になること、この辺の細かい挙動を頭に入れておくと、思わぬデータ欠けを避けられると思います。
よくある質問
Q. 既定で消えるのは空白だけですか?
A. いいえ。スペース、タブ、改行(\n \r)、ヌル文字、垂直タブが対象です。フォーム入力の末尾改行が落ちるのは、この仕様のおかげです。
Q. 末尾のスラッシュだけ消したいです。
A. rtrim($path, '/') のように第2引数で削る文字を指定します。端にある限り連続して削られる点だけ意識しておいてください。
Q. ltrim で前ゼロを落とすときの注意は?
A. "0000" のように全部ゼロだと空文字になります。数値として扱うなら、素直にキャストするほうが安全な場面も多いです。