PHP Tips | 文字列処理:入力補助 - 空白区切り文字列 → 配列

PHP PHP
スポンサーリンク

何をしたいユーティリティなのか

「空白区切り文字列 → 配列」は、 例えばこんな入力を、

"apple orange banana"

こういう配列に変換するユーティリティです。

["apple", "orange", "banana"]

タグ入力、検索キーワード、権限名の指定など、 「スペースで区切って複数指定したい」場面は業務でめちゃくちゃ多いです。 毎回 explode(' ', ...) と書いてもいいのですが、 実務では「連続スペース」「タブ」「全角スペース」「前後の空白」など、地味な罠がたくさんあります。

それを一気に吸収してくれるのが、このユーティリティです。

素朴な explode の問題点を知る

explode(‘ ‘) だと困るケース

PHP には explode(' ', $str) がありますが、 そのまま使うと、こういう問題が出ます。

$input = 'apple  orange   banana';

$parts = explode(' ', $input);

var_dump($parts);
PHP

結果はこうなります。

array(6) {
  [0] => string(5) "apple"
  [1] => string(0) ""
  [2] => string(6) "orange"
  [3] => string(0) ""
  [4] => string(0) ""
  [5] => string(6) "banana"
}
PHP

連続スペースのところで「空文字」がたくさんできてしまいます。 さらに、タブや全角スペースは区切りとして扱われません。

業務で扱う入力は「きれいな 1 スペース区切り」だけではないので、 もう少し賢い分割が必要になります。

正規表現で「空白全般」を区切りにする

\s+ を使った分割の基本

PHP の preg_split を使うと、「空白全般」をまとめて区切りにできます。

\s は「空白文字」を意味します。 半角スペース、タブ、改行、などが含まれます。 + は「1 回以上の繰り返し」です。

つまり、/\s+/ は「1 個以上連続した空白」を 1 つの区切りとして扱う、という意味になります。

これを使ってユーティリティを作ると、こうなります。

function split_by_whitespace(string $input): array
{
    // 前後の空白を削る
    $input = trim($input);

    if ($input === '') {
        return [];
    }

    // 空白(スペース・タブ・改行など)の連続で分割
    $parts = preg_split('/\s+/', $input);

    // preg_split は失敗すると false を返すので保険をかけておく
    if ($parts === false) {
        return [];
    }

    return $parts;
}
PHP

ここでの重要ポイントは、

1行目で trim して、前後の余計な空白を落としていること。 preg_split('/\s+/', ...) で「連続空白を 1 つの区切り」として扱っていること。

この 2 つで、かなり現実的な入力をきれいに配列化できます。

例題で挙動を確認する

シンプルなスペース区切り

$input = 'apple orange banana';

var_dump(split_by_whitespace($input));
PHP

結果はこうです。

array(3) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
}
PHP

期待通りですね。

連続スペース・タブ・改行が混ざる場合

$input = "apple   orange\tbanana\nmelon";

var_dump(split_by_whitespace($input));
PHP

結果はこうなります。

array(4) {
  [0] => "apple"
  [1] => "orange"
  [2] => "banana"
  [3] => "melon"
}
PHP

連続スペースもタブも改行も、全部「区切り」として扱われ、 空文字は一切含まれていません。

前後に空白がある場合

$input = "   apple orange   ";

var_dump(split_by_whitespace($input));
PHP

結果はこうです。

array(2) {
  [0] => "apple"
  [1] => "orange"
}
PHP

trim しているので、前後の空白は無視されます。

実務での使いどころ

タグ入力の補助

例えば、管理画面で「記事のタグ」を入力するとき、 「スペース区切りで複数タグを入力できるようにしたい」というケースがあります。

$rawTags = $_POST['tags'] ?? '';

$tags = split_by_whitespace($rawTags);

// 重複を消す
$tags = array_values(array_unique($tags));

// 空文字はそもそも入ってこないので、そのまま保存できる
PHP

ユーザーが、

php backend utility

と入力すれば、['php', 'backend', 'utility'] という配列になります。 連続スペースやタブが混ざっていても、きれいに分割されます。

検索キーワードの分割

検索フォームで「複数キーワードをスペース区切りで入力してもらう」場合も同じです。

$rawQuery = $_GET['q'] ?? '';

$keywords = split_by_whitespace($rawQuery);

// 各キーワードで部分一致検索、などに使える
PHP

"php ログ ユーティリティ" のように、 半角スペースと全角スペースが混ざっていても、 preg_split('/\s+/') ならまとめて区切りにできます。

もう一歩:全角スペースも確実に扱いたい場合

mb_convert_kana との組み合わせ

\s には「全角スペース」が含まれないことがあります。 日本語環境では、ユーザーが全角スペースで区切ってくることも多いので、 確実に扱いたければ、前処理で半角にそろえます。

function split_by_whitespace_jp(string $input): array
{
    // 全角スペースを半角に
    $input = mb_convert_kana($input, 's', 'UTF-8');

    // 前後の空白を削る
    $input = trim($input);

    if ($input === '') {
        return [];
    }

    $parts = preg_split('/\s+/', $input);

    if ($parts === false) {
        return [];
    }

    return $parts;
}
PHP

これで、

"php ログ ユーティリティ"(全角スペース)

も、きれいに ['php', 'ログ', 'ユーティリティ'] に分割できます。

まとめ:今日からの「空白区切り文字列 → 配列」ユーティリティ

このユーティリティの本質は、「ユーザーが“なんとなく空白で区切って入力したもの”を、きれいな配列にしてあげる」ことです。

そのために、

前後の空白を trim で落とす。 preg_split('/\s+/') で連続空白を 1 つの区切りとして扱う。 必要なら mb_convert_kana で全角スペースも半角にそろえる。

という処理を 1 本の関数に閉じ込めておきます。

もう一度、基本形を載せておきます。

function split_by_whitespace(string $input): array
{
    $input = trim($input);

    if ($input === '') {
        return [];
    }

    $parts = preg_split('/\s+/', $input);

    if ($parts === false) {
        return [];
    }

    return $parts;
}
PHP

もし、あなたのコードのどこかで「explode(' ', $_POST['tags'])」のような行があれば、 そこをこのユーティリティに差し替えてみてください。 連続スペースやタブ、改行、全角スペースに悩まされることが、ぐっと減ります。

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