PHPの文字列にある空白(スペース・タブ)の削除方法

19/05/11 23:54:44     19/06/02 13:24:43

PHPの文字列にある空白(スペース・タブ)の削除方法

普段文章を書く際にはそこまで気にしていない人が多いかもしれませんが、プログラミングにおいてはスペースやタブの扱いが非常に重要です。スペースは不用意に入っているとバグの原因になり、タブはインデントにおいて重要です。

バグを防いでインデントの美しいソースコードにするためには、スペースとタブの扱いは徹底しておくべきと言えるでしょう。スペースのことが頭から抜け落ちていると、スペースが原因のバグに気付かずに1日中頭を悩ませるようなことになりかねません。

実際私も変なところにスペースが入っていることに気付かず、何時間か苦戦した経験があります。そこでこのページでは、PHPで文字列にある不必要なスペースとタブを取り除くコードを紹介します。

スペースとタブを削除する関数

変数に自分で文字列を格納するなら最初から空白を入れなければ良いのですが、処理の過程でいったん上の名前と下の名前の間に空白が入ったり、ユーザー入力の際にスペースやタブを削除する必要があるケースもあります。

たとえば入力フォームに文字を入力しているユーザーの多くはスペースやタブのことをあまり意識していないので、「なんでスペースが入ってるくらいでエラーになるんだよ、そのくらいなんとかそっちで調整してくれよ」となります。

なので、簡単に調整しておきましょう。そこで便利な関数が、preg_replace関数やtrim関数です。またそこまで使用頻度は多くないかもしれませんが、先頭と末尾のみのスペースやタブを取り除けるltrim関数、rtrim関数があります。

trim関数は文字列の先頭と末尾の両方を取り除けるという点でltrim関数やrtlim関数よりも便利で、この二つを合体させたようなイメージです。しかし、これらは三つともマルチバイトには対応していません。

つまり、全角スペースは取り除けないということです。ユーザーのフォーム入力などでは当然全角スペースが入り込む可能性もあるので、全角スペースも取り除けた方がベストです。

ということで、この四つの関数の中だとpreg_replace関数がもっとも利便性が高いことになります。

preg_replace関数でスペースとタグを削除する

preg_replace関数の使い方をサンプルコードで確認します。

//空白を取り除く前の文字列を用意
$str1 = ” テキストの前後にある空白を削除する “;
//初期値はnullで、ここに空白を取り除いた後の文字列が格納される
$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) “テキストの前後にある空白を削除する”

正規表現に慣れていない方は何これ?となるかもしれませんが、特に業務用システムなどの入力フォームを作る際には、正規表現は必須知識と言っても過言ではありません。

というのも、ユーザーはいろいろな形でフォームに入力し、作り手の意図した通りに入力してくれるとは限りません。なんでもかんでもエラーにしていてはユーザビリティが下がりますが、だからといって何でもそのまま通していては処理上都合が悪いです。

なので、正規表現で整える必要があるのです。今回はそれを空白でやっているイメージになります。

正規表現の解説

preg_replace関数を使いこなすためには正規表現の理解が必須なので、正規表現について解説していきます。上で出てきた例だと、以下のようになっています。

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

まずこの中で最初に着目すべきポイントは、「u」の部分です。このuはパターン修飾子というもので、文字コードの指定を行います。uだと、UTF-8で処理することを意味しています。

世界的に文字コードはUTF-8がもっとも一般的かと思うので、ほとんどの場合パターン修飾子は「u」を指定することになるでしょう。次に注目すべき点はデリミタです。

デリミタとは、上のサンプルコードでは「\A」と「\z」の部分です。これが何を意味しているかというと、シンプルに文字列の先頭と末尾を意味しています。Aはアルファベットの一番先頭なので先頭を意味し、zはアルファベットの一番後ろなので末尾を意味しているのでしょう。

次に真ん中の「++」は接続を意味するコードです。++の前の前半部分は、「\A」で指定した先頭部分のパートです。++の後ろは「\z」で指定した末尾部分のパートになっています。

正規表現はパッと見意味不明だったかと思いますが、細分化していくとそれほど複雑なものではありません。次に、いよいよ空白のプロパティです。空白のプロパティとは、空白かどうかをチェックするための正規表現のことです。

上のサンプルコードでは、「[\p{C}\p{Z}]」の部分が空白のプロパティに該当します。最初の++の前後に「[\p{C}\p{Z}]」があるのがわかります。つまり、前後の両方で空白プロパティを指定しているということです。

空白プロパティをより細分化していくと、まず「\p{C}」の部分は「その他の文字」を意味します。なぜこれを使用するのかというと、何の文字が入るかわからないからです。

空白の削除が目的なので、その後ろの文字列は関係なくて、「何らかの文字列」と指定しておけば良いのです。次に、「\p{Z}」は「区切り文字」を意味します。つまり、空白文字を含みます。

trim関数の使い方

preg_replace関数は実用的で、業務用システムであれば万全の対策になります。しかし正規表現が難しい、もっと簡単によくあるスペースだけ取り除ければ問題ない、といったケースもあるでしょう。その場合、trim関数を使用した方が簡単です。サンプルコードは以下になります。

//空白を取り除く前の文字列を用意
$str1 = ” Text Sample “;
//初期値はnullで、ここに空白を取り除いた後の文字列が格納される
$str2 = null;

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

// 空白を取り除く前の文字列
var_dump($str1);

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

このコードを実行すると、以下のようになります。

// 空白を取り除く前の文字列
string(19) ” Text Sample ”

// 空白を取り除いた後の文字列
string(11) “Text Sample”

正規表現なども特に出てこないので、非常に簡単です。ちなみに、ltrim関数、rtrim関数についても同じ使い方になります。それぞれ先頭と末尾の空白のみ削除されます。

以上空白の削除方法を紹介しましたが、preg_replace関数を使いこなせば空白文字だけでなく他の形式を指定することも可能です。

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する