何をしたいユーティリティなのか
「空白区切り文字列 → 配列」は、 例えばこんな入力を、
"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"
}
PHPtrim しているので、前後の空白は無視されます。
実務での使いどころ
タグ入力の補助
例えば、管理画面で「記事のタグ」を入力するとき、 「スペース区切りで複数タグを入力できるようにしたい」というケースがあります。
$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'])」のような行があれば、 そこをこのユーティリティに差し替えてみてください。 連続スペースやタブ、改行、全角スペースに悩まされることが、ぐっと減ります。

