PHPプログラミング

レシピ

文字列

文字列の前後にある空白文字(スペース・タブ)を取り除く

preg_replace関数trim関数を使い、文字列の前後に含まれる空白を除去する方法について解説します。

この記事のポイント

  • 文字列の前後にある不要な空白を取り除く
  • マルチバイト対応のpreg_replace関数を使う方法がオススメ

目次

文字列の前後の空白を取り除く

preg_replace関数trim関数を使うと、文字列の前後にあるスペースやタブなどの空白文字を取り除くことができます。

例えば、フォームなどでユーザーが入力した値をシステムが受け取る際に、メールアドレスやパスワードの前後に打ち間違いなどで空白文字が含まれていることがあります。
これらの入力ミスをシステム側で自動的に取り除くことができると非常に便利です。

そこで今回は、次の4つの関数を使う方法で文字列の前後に含まれる空白を取り除く方法を解説していきます。

  • preg_replace関数 – 正規表現による検索で空白を除去
  • trim関数 – 文字列の先頭・末尾にある空白を除去
  • ltrim関数 – 文字列の先頭にある空白を除去
  • rtrim関数 – 文字列の末尾にある空白を除去

preg_replace関数で正規表現を使う方法ではマルチバイトの空白も取り除くことができますが、下の3つはマルチバイトの空白に対応していません。
なので、全角スペースも含めて取り除きたい場合は、preg_replace関数を使った方法が有効になります。

それでは、1つずつみていきましょう。

preg_replace関数

正規表現を使って文字列の前後に空白があるかを検索し、もし見つかった場合は空の値に差し替えることで空白を取り除きます。

コード例

$str1 = "   テキストの前後にある空白を削除する ";
$str2 = null;

// 空白を取り除く
$str2 = preg_replace( '/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str1);

// 空白を取り除く前
var_dump($str1);

// 空白を取り除いた後
var_dump($str2);

出力例

// 空白を取り除く前
string(55) " テキストの前後にある空白を削除する "

// 空白を取り除いた後
string(51) "テキストの前後にある空白を削除する"

$str1には空白を取り除く前の文字列、$str2には取り除いた後の文字列が入ります。
出力結果から、文字列の前後にあった空白が綺麗に取り除かれていることが分かりますね。

正規表現のパターン「‘/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u’」について解説します。

パターン修飾子

コード例

preg_replace( '/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str1);

パターンの末尾に付いている「u」はパターン修飾子と呼び、この値はパターンと検索する文字列$str1を「UTF-8で処理するという明示的な指定になります。

デリミタ

コード例

preg_replace( '/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str1);

パターンの前後にある「\A」は文字列の先頭、「\z」は文字列の末尾を指しています。
PHPの正規表現では「^」や「$」などのデリミタがよく使用されますが、これらのデリミタは「行」の先頭と末尾を指すため「文字列」の先頭と削除を指すのとは少しニュアンスが異なります。

ここでは正確に文字列の先頭と末尾をチェックするために、「\A」「\z」を使います。

つまり、今回使っているパターンは文字列の先頭を指す「\A[\p{C}\p{Z}]++」か、末尾を指す「[\p{C}\p{Z}]++\z」の2つのパートで構成されています。

空白の文字プロパティ

コード例

preg_replace( '/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str1);

\p{C}」と「\p{Z}」はUnicode文字プロパティです。
\p{C}」は「コントロール文字」「非可視整形用文字」などを含む「その他」の文字、「\p{Z}」は「行区切り文字」「段落区切り文字」「空白文字」などの「区切り文字」を指しています。

つまり、今回の目的である「空白を取り除く」ことで言うと「\p{Z}」で取り除くことができますが、「\p{C}」で不要な文字も一緒に削除しています。

絶対最大量指定子

コード例

preg_replace( '/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str1);

++」は絶対最大量指定子と呼ばれ、通常は「1字以上の繰り返し」の指定では「+」を使いますが、さらにもう一つ付け加えてた「++」と記述しています。
この指定は検索のバックトラックを防いでパフォーマンスを向上させる効果があります。

ここまでが文字列の先頭を検索するパターンの解説になりますが、「| (パイプライン)」で折り返しいた末尾の検索パターンについても末尾に「\z」つく以外は同じ内容です。
以上の検索パターンを持って、文字列の先頭か末尾に空白文字、もしくは不要な文字が含まれていたら「空」に置き換えを行います。

trim関数

文字列の先頭・末尾にある空白(半角スペース、Tab)を除去する関数です。

コード例

$str1 = " 	Text Sample      ";
$str2 = null;

// 空白を取り除く
$str2 = trim($str1);

// 空白を取り除く前
var_dump($str1);

// 空白を取り除いた後
var_dump($str2);

出力例

// 空白を取り除く前
string(19) " Text Sample "

// 空白を取り除いた後
string(11) "Text Sample"

trim関数は文字列の前後にある、次の空白文字を削除することができます。

  • ” ” – 通常の空白文字
  • \t” – タブ
  • \n” – リターン
  • \r” – 改行
  • \0” – Nulバイト
  • \x0B” – 垂直タブ

ltrim関数

ltrim関数は文字列の先頭のみを対象に空白文字を取り除きます。

コード例

$str1 = " 	Text Sample      ";
$str2 = null;

// 空白を取り除く
$str2 = ltrim($str1);

// 空白を取り除く前
var_dump($str1);

// 空白を取り除いた後
var_dump($str2);

出力例

// 空白を取り除く前
string(19) " Text Sample "

// 空白を取り除いた後
string(17) "Text Sample "

末尾の空白文字は残ります。
また、取り除く対象の空白文字はtrim関数と同じです。

rtrim関数

rtrim関数ltrim関数とは対象的に、文字列の末尾のみを対象に空白文字を取り除きます。

コード例

$str1 = " 	Text Sample      ";
$str2 = null;

// 空白を取り除く
$str2 = rtrim($str1);

// 空白を取り除く前
var_dump($str1);

// 空白を取り除いた後
var_dump($str2);

出力例

// 空白を取り除く前
string(19) " Text Sample "

// 空白を取り除いた後
string(13) " Text Sample"

文字列の末尾のみ空白が取り除かれ、先頭の空白文字はそのままであることが確認できます。

結局どの方法を使えばいいの?

マルチバイトの文字を扱う想定であればpreg_replace関数を使い、それ以外の環境ではtrim関数を使う方法が手軽です。
ただ、パスワードなど日本語での入力を想定していない場合でも日本語の入力値が送られてくるケースも考えられるため、基本的にはマルチバイト対応をしておいた方が良いと思います。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。