Menu

PHPのtrim():前後の空白を削除する、全角スペース対応

trim($string)は文字列の両端から空白、タブ、改行を取り除き、ltrim()とrtrim()は片側だけをきれいにします。特定の文字のtrim、日本語の全角スペース、配列のすべての値のtrimを学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

trim($string)は、先頭と末尾から空白文字を取り除いた文字列を返します。空白、タブ、改行、復帰、NULバイト、垂直タブです。ltrim()は先頭からだけ、rtrim()は末尾からだけ取り除きます。途中の空白は残ります。

var_dump()の出力には各結果の長さが表示されるので、取り除かれた文字がわかります。フォームから来るほとんどの値に対して、最初に行うのがtrimです(例外はパスワードで、ページの最後を参照してください)。末尾に空白を付けてada@example.com と入力したユーザーも、ログインできるべきだからです。

構文

trim(string $string, string $characters = " \n\r\t\v\0"): string
ltrim(string $string, string $characters = " \n\r\t\v\0"): string
rtrim(string $string, string $characters = " \n\r\t\v\0"): string

trim()は新しい文字列を返し、渡した変数は変更しません。

特定の文字をtrimする

2つ目の引数はデフォルトのリストを置き換えます。そこに含まれる文字は、順番も回数も問わず両端から取り除かれます。..は範囲を表すので、'a..z'はすべての小文字の英字の意味です。

普通の空白文字も引き続き取り除くには、リストに含めます:trim($s, " \n\r\t\v\0/")。

2つ目の引数は文字列ではなく文字の集合

trim()は単語や接尾辞を取り除くわけではありません。リストにある文字のどれかを、リストにない文字に行き当たるまで両端から取り除きます。ファイルの拡張子を取り除こうとすると驚くことになります。

hも集合に入っているので、1行目は先頭のhも取り除いてしまいます。決まった接頭辞や接尾辞を取り除くには、str_starts_with()やstr_ends_with()とsubstr()を使うか、そのテキストがほかの場所に現れえないならstr_replace()を使います。

全角スペースをtrimする(日本語の入力)

日本語のキーボードでは、フォームに入力された名前の前後などに、全角スペース (U+3000)がよく入ります。これはtrimのデフォルトのリストになく、2つ目の引数に書くのは罠です。trim()はバイト単位で動き、全角スペースはE3 80 80の3バイトで、E3はすべてのひらがなとカタカナの先頭バイトでもあるので、それらで始まる名前はその文字の先頭バイトを失います。u修飾子付きの正規表現を使いましょう。

\Aと\zは文字列の先頭と末尾に固定します。u修飾子を付けると、\sはすべてのUnicodeの空白に一致します。ASCIIの空白文字、全角スペース、そしてWebページからのコピー&ペーストでよく紛れ込むノーブレークスペース(U+00A0)です。uがなければ、\sはASCIIの空白文字にしか一致せず、全角スペースは残ります。PHP 8.4ではこのためのmb_trim()、mb_ltrim()、mb_rtrim()が追加されました。PHP 8.3以前では正規表現を使います。

配列のすべての値をtrimする

array_map('trim', $array)は各値をtrimし、キーを保ちます。典型的なのは、テキスト欄から来たカンマ区切りのリストをexplode()で分割した場合です。

検証の前にフォームの値をtrimする

先にtrimしてから、空文字列かどうかを確認します。そうすれば、空白だけの項目は空として拒否されます。このブロックを実行し、前後に空白を付けた名前をフォームに入力してSendを押すと、$_POSTに値が入った状態で同じスクリプトがもう一度実行されます。

パスワードはtrimしないでください。パスワードの末尾の空白も、パスワードの一部です。

よくある質問

PHPのtrim()は何を取り除きますか?

デフォルトでは、文字列の両端から空白、タブ(\t)、改行(\n)、復帰(\r)、NULバイト(\0)、垂直タブ(\v)を取り除きます。文字列の途中には決して触れません。

trim、ltrim、rtrimの違いは何ですか?

trim()は両端を、ltrim()は先頭だけを、rtrim()は末尾だけをきれいにします。3つとも、取り除く文字のリストを同じように任意で受け取ります。

trim()で日本語の全角スペースが取り除かれないのはなぜですか?

全角スペース(U+3000)はtrimのデフォルトのリストに入っておらず、UTF-8では3バイトです。preg_replace('/\A\s+|\s+\z/u', '', $s)を使います。u修飾子を付けると、\sはU+3000を含むすべてのUnicodeの空白に一致します。PHP 8.4では、これも取り除くmb_trim()が追加されました。

PHPで文字列の最後のカンマを取り除くには?

rtrim($s, ',')は末尾のカンマをすべて取り除きます。後ろに空白が続くかもしれないなら、空白も含めます:rtrim($s, ', ')。

配列のすべての値をtrimするには?

array_map('trim', $array)は、キーを保ったまますべての値をtrimした新しい配列を返します。ネストした配列には、参照を使ったarray_walk_recursive()を使います。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める