PHP Tips | 文字列処理:基本操作 – 前後の全角・半角スペース除去

PHP PHP
スポンサーリンク

「前後の全角・半角スペース除去」とは何か

PHP で文字列を扱うとき、ユーザー入力や外部データには「余計なスペース」がくっついていることがよくあります。
しかも、日本語環境だと「半角スペース」だけでなく「全角スペース」も混ざります。

例えば、次のような文字列です。

$text = "  山田太郎  ";  // 先頭に全角スペース、後ろに半角スペース
PHP

見た目では分かりにくいですが、実際には「前後にいろいろなスペース」が入っています。
このまま比較したり、検索したり、DB に保存したりすると、意図しない不一致やバグの原因になります。

そこでやりたいのが、

「文字列の前後にある全角・半角スペースをきれいに取り除く」

という処理です。


なぜ前後のスペースをきちんと削る必要があるのか

比較や検索で「同じはずなのに違う」問題を防ぐ

例えば、ユーザーが「山田太郎」と入力したつもりでも、実際にはこうなっていることがあります。

$input = "山田太郎 ";   // 後ろに半角スペース
$target = "山田太郎";

var_dump($input === $target);  // bool(false)
PHP

見た目は同じでも、プログラム的には「違う文字列」です。
ログインID、メールアドレス、商品コードなどでこれをやられると、かなり困ります。

前後のスペースを削っておけば、こうした「見た目は同じなのに一致しない」問題をかなり減らせます。

DB のデータをきれいに保つ

前後にスペースがついたまま DB に保存すると、後から検索するときにややこしくなります。

WHERE name = '山田太郎'
PHP

と書いても、実際のデータが '山田太郎 '(後ろにスペース)だとヒットしません。
保存前に前後のスペースを削っておけば、データがきれいにそろい、後の集計や検索が楽になります。


PHP の基本:半角スペースを削る trim 系関数

trim の基本(半角スペース中心)

PHP には、文字列の前後から「余計な文字」を削るための関数が用意されています。

$text = "  Hello World  ";

$trimmed = trim($text);

var_dump($trimmed);  // string(11) "Hello World"
PHP

trim はデフォルトで、次のような「空白文字」を前後から削ってくれます。

  • 半角スペース " "
  • タブ \t
  • 改行 \n など

ただし、ここが重要ポイントで、

trim は「全角スペース( )」は削ってくれない

という点をしっかり覚えておいてください。


全角スペースが混ざるとどうなるか

日本語入力だと、先頭に全角スペースが入ってしまうことがよくあります。

$text = " 山田太郎 ";  // 全角スペースで囲まれている

$trimmed = trim($text);

var_dump($trimmed);
PHP

この場合、trim では全角スペースが削れないので、結果はこうなります。

string(18) " 山田太郎 "
PHP

見た目は変わっていません。
つまり、「日本語環境で本気で前後のスペースを削りたいなら、全角スペースも自分で対処する必要がある」ということです。


全角・半角スペースを両方削る実用的な書き方

パターン1:str_replace と trim を組み合わせる

一番シンプルで分かりやすい方法は、「全角スペースを半角スペースに置き換えてから trim する」やり方です。

$text = "  山田太郎  ";

// 全角スペースを半角スペースに変換
$text = str_replace(" ", " ", $text);

// そのうえで trim で前後の半角スペースを削る
$text = trim($text);

var_dump($text);  // string(15) "山田太郎"
PHP

流れとしてはこうです。

  1. 全角スペースを半角スペースに変換する
  2. trim で前後の半角スペースを削る

これだけで、「前後の全角・半角スペースをまとめて削る」ことができます。


パターン2:正規表現で「前後の全角・半角スペース」を直接削る

もう少しスマートにやりたい場合は、preg_replace(正規表現)を使う方法があります。

$text = "  山田太郎  ";

$text = preg_replace('/^[\s ]+|[\s ]+$/u', '', $text);

var_dump($text);  // string(15) "山田太郎"
PHP

ここでのポイントを分解して説明します。

  • / ... /u は「UTF-8 として扱う」という指定
  • [\s ] は「半角の空白文字(\s)か、全角スペース( )」
  • ^[\s ]+ は「先頭にある、1文字以上の空白」
  • [\s ]+$ は「末尾にある、1文字以上の空白」
  • | は「または」

つまり、この正規表現は

「文字列の先頭または末尾にある、半角・全角スペースを全部削る」

という意味になります。

初心者には少し難しく見えるかもしれませんが、「前後のスペースを一気に削る定番パターン」として覚えておくと、実務でかなり役立ちます。


パターン3:共通関数として定義しておく

何度も同じ処理を書くなら、関数にしておくとコードが読みやすくなります。

function trimBothSpaces(string $text): string
{
    // 全角スペースを半角スペースに
    $text = str_replace(" ", " ", $text);
    // 前後の半角スペースやタブ、改行を削除
    return trim($text);
}

$input = "  山田太郎  ";
$result = trimBothSpaces($input);

var_dump($result);  // string(15) "山田太郎"
PHP

関数名を見ただけで、

「ああ、前後の全角・半角スペースを削っているんだな」

と分かるので、チーム開発でも意図が伝わりやすくなります。


実務での具体的なシチュエーション例

例題1:ログインIDやメールアドレスの前後スペースを削る

ユーザーがログインIDやメールアドレスを入力するとき、うっかり前後にスペースを入れてしまうことがあります。

$email = $_POST['email'] ?? "";

// 前後の全角・半角スペースを削る
$email = trimBothSpaces($email);

// このあとでバリデーションや認証処理
PHP

ここで前後のスペースを削っておかないと、

  • 「正しいメールアドレスなのにログインできない」
  • 「同じメールアドレスなのに重複チェックで引っかからない」

といったトラブルにつながります。


例題2:CSV インポート時に項目の前後スペースを削る

業務システムでは、CSV でデータを取り込むことがよくあります。
Excel で作られた CSV には、前後にスペースがついていることが珍しくありません。

$row = [
    'code' => "  A001 ",
    'name' => " 山田太郎 ",
];

$row['code'] = trimBothSpaces($row['code']);
$row['name'] = trimBothSpaces($row['name']);

var_dump($row);
PHP

結果はこうなります。

array(2) {
  ["code"]=>
  string(4) "A001"
  ["name"]=>
  string(15) "山田太郎"
}

これで、「コードや名前の前後に余計なスペースがない状態」で DB に保存できます。


例題3:配列の全項目に一括で適用する

フォームや CSV から来たデータを配列で受け取っている場合、array_map を使って一気に前後スペースを削ることもできます。

$data = [
    'name'     => " 山田太郎 ",
    'nickname' => "  たろう  ",
    'email'    => " test@example.com ",
];

function trimBothSpaces(string $text): string
{
    $text = str_replace(" ", " ", $text);
    return trim($text);
}

$data = array_map('trimBothSpaces', $data);

var_dump($data);
PHP

実行結果は次のようになります。

array(3) {
  ["name"]=>
  string(15) "山田太郎"
  ["nickname"]=>
  string(12) "たろう"
  ["email"]=>
  string(16) "test@example.com"
}

このように、「アプリ内部では前後スペースがきれいに削られた状態」という前提でロジックを書けるようになります。


重要ポイントの深掘り

trim だけでは「全角スペースは削れない」ことを忘れない

ここが一番の落とし穴です。

$text = " 山田太郎 ";

var_dump(trim($text));  // 全角スペースは残る
PHP

trim したから大丈夫」と思っていても、日本語入力で混ざる全角スペースはそのまま残ります。
日本語環境で実務コードを書くなら、

「全角スペースをどう扱うか」

を必ず意識する必要があります。

「どのタイミングで前後スペースを削るか」を決める

実務では、次のようなタイミングのどこかで「前後スペースを削る」ことが多いです。

  • フォーム入力を受け取った直後
  • CSV や API からデータを読み込んだ直後
  • DB に保存する直前

初心者のうちは、

「外から入ってきた文字列は、まず前後の全角・半角スペースを削る」

というマイルールを持っておくと、かなりバグを減らせます。


まとめ:今日から使える「前後の全角・半角スペース除去」テンプレ

シンプル版(全角→半角→trim)

function trimBothSpaces(string $text): string
{
    $text = str_replace(" ", " ", $text); // 全角スペースを半角に
    return trim($text);                    // 前後の半角スペースなどを削除
}

$clean = trimBothSpaces($rawText);
PHP

正規表現版(前後の全角・半角スペースを直接削る)

function trimBothSpacesRegex(string $text): string
{
    return preg_replace('/^[\s ]+|[\s ]+$/u', '', $text);
}

$clean = trimBothSpacesRegex($rawText);
PHP

どちらか一つ、自分が「しっくりくる方」をまずは手癖にしてしまうといいです。

タイトルとURLをコピーしました