【PHP講座】正規表現

正規表現

※この記事は「2021年4月29日」に更新しました。

前回は、名前空間について紹介しました。

名前空間とは

【PHP講座】名前空間とは

2019年7月2日

今回は、PHP の正規表現について。

PHP は、フォームを扱うことが多い、プログラミング言語です。

以前のセキュリティの記事を書かせていただいたとき、バリデーションが重要であることをお伝えしたかと思います。

正規表現があれば、本来ならば複雑な手順を踏まなければいけないチェックが非常にシンプルになります。

ぱそた
SE、Web制作、販売を経験した管理人が解説します。



正規表現とは

例えば、郵便番号(ハイフン付)かどうか判定する場合。

  • 文字列長が8桁であること
  • 4桁目にハイフンが含まれること
  • 1~3桁は数字で構成されていること
  • 5~8桁は数字で構成されていること

これらを全て満たしているかどうか、何段階に分けてチェックする必要があります。

正規表現を使えば、下記のように表現できます。

[0-9]{3}-[0-9]{4}

つまり、正規表現とは、データを正しく定型的な形で手軽に抽出するためのものです。

正規表現の基本

正規表現によって表された文字列パターンのことを正規表現パターンといいます。

正規表現パターン 修飾子

このような感じで表現します。

修飾子は、正規表現がマッチングするときの動作オプションを示すものです。

正規表現のパターン例

正規表現の良く使うパターンを紹介します。

基本的な使い方

[aiueo]

これは、a、i、u、e、o のいずれかの文字という意味です。

範囲を指定する

[0-9]

これは、数字の 0~9 のいずれかという意味です。

つまり、特定の範囲を指定するということですね。

否定

[^0-9]

これは、0~9 以外の文字という意味です。

任意の1文字

g.d

. は、任意の1文字を表します。

例えば、god という文字列にマッチします。

先頭、末尾を検出

^win

^ は、文字列の先頭にマッチします。

例えば、windows という文字列にマッチします。

dows$

$ は、文字列の末尾にマッチします。

こちらも、windows という文字列にマッチします。

直前の要素の繰り返し

[0-9]{3}

これは、0~9 のいずれかを3回繰り返すパターンという意味です。

つまり、333 とか 123 とか 391 とか 3桁の数字にマッチするわけです。

PHP で利用される正規表現の関数

PHP で利用される正規表現の関数を紹介します。

preg_match関数

preg_match関数は、下記のような構文になります。

preg_match(正規表現パターン, 検索対象の文字列, 配列[マッチした値が格納される])

マッチに成功した場合は、1 を返し、マッチしない場合は、0 を返します。

ただし、preg_match関数は、マッチング対象文字列が複数あったとしても最初の1回しかマッチング処理を行いません。

第3引数の配列には、マッチした値が格納されます。

格納には決まりがあり、例えば、以下のような正規表現パターンの場合。

[0-9]{3}-[0-9]{4}

012-3456 でマッチしたと仮定すると配列($data として)には以下のように格納されます。

$data[0] に 012-3456
$data[1] に 012
$data[2] に 3456

まず、マッチ文字列全体を配列の最初の要素に格納されます。

次に、サブマッチ文字列を先頭から順番に格納していくというわけです。

preg_match_all関数

preg_match_all関数は、下記のような構文になります。

preg_match_all(正規表現パターン, 検索対象の文字列, 配列[マッチした値が格納される])

構文そのものは、preg_match関数とほぼ同じです。

ただし、preg_match_all関数は、マッチした値が複数格納されるため、2次元配列になります。

マッチに成功した場合は、1 を返し、マッチしない場合は、0 を返します。

preg_replace関数

preg_replace関数は、下記のような構文になります。

preg_replace(正規表現パターン, 置換後の文字列, 置換対象の文字列, 置換の上限回数[省略可])

返り値は、置換が行われた新しい文字列を返します(パターンがマッチした場合)。

最後に

いかがでしょうか。

ちなみに PCRE正規表現(今回紹介したもの)の正規表現パターンは基本的に /(スラッシュ)で囲むのが一般的です。

なかなか奥が深い分野で、私もまだまだ勉強する必要があると思っています。

とにかく PHP で使う場面が出てきたときに、この記事が少しでも役に立てば幸いです。