PHPの正規表現
正規表現とは、通常の文字とメタキャラクタという特殊な意味を持った文字から構成する文字列パターンで、正規表現を使うことで、ある文字列から特定のパターンに一致する部分を検索したり切りだしたりすることができます。
Webのプログラムでは、ユーザーが入力フォームに入力した文字列が正しいかどうかを確認(妥当性)や、検索の際のキーワード文字列等にも使用します。
メタキャラクタを使用したマッチング
パターン化された文字列を挙げると、身近な所では電話番号や郵便番号、Webサイトのアドレスやメールアドレスその他にもいろいろあると思います。
電話番号のパターンを定義してみましょう(総務省のサイトでもっと厳密に定義をしていますが結構複雑なのでその辺は適宜端折ってます)。
① 数値が3つのグループに分けられグループの間はハイフンが入る
② 第1グループは、0から始まり2~4桁で表現する
③ 第2グループは、2~4桁
④ 第3グループは、3~4桁
これを正規表現で表すと、
1 |
^0[0-9]{1,3}-[0-9]{2,4}-[0-9]{3,4}$ |
[0-9]は1桁数字なので\dを使って以下でもOKです。
1 |
^0\d{2,4}-\d{2,4}-\d{3,4}$ |
^ | 行頭の位置 |
---|---|
$ | 行末の位置 |
[0-9] | 0~9の数字1文字 |
\d | 0~9の数字1文字 |
{MIN,MAX} | 直前のパターンの繰り返し回数の範囲 |
代表的なメタキャラクタを以下に挙げます。
[a-zA-Z0-9] | 英数字の1文字 |
---|---|
[^a-zA-Z0-9] | 英数字以外の1文字 |
[a-zA-Z] | アルファベット1文字 |
[a-z] | アルファベット小文字1文字 |
[A-Z] | アルファベット大文字1文字 |
. | 改行を除くすべての文字 |
---|---|
* | 直前のパターンの0回以上連続 |
? | 直前のパターンの0回か1回の出現 |
+ | 直前のパターンの1回以上連続 |
\n | 改行コード(Line Feed) |
---|---|
\r | 改行コード(Carriage Return) |
\R | 全ての改行コード(\n,\r,\n\r) |
\t | タブ |
\s | 空白文字 |
\D | 数字以外の文字 |
\w | 英数字とアンダースコアの中の1文字 |
\W | 英数字とアンダースコア以外の中の1文字 |
\l | 半角英数字の1文字 |
\L | 半角英数字以外の1文字 |
PHPの性表現を使った標準関数
PHPで正規表現を使う関数で「preg_match」があります。
「preg_match」ではある文字列から正規表現で指定したパターンにマッチした文字列を検索することができます。パターンにマッチした場合は1を返し、マッチしなかったら0を返します。
「preg_match」に電話番号の正規表現を使用して確認してみましょう。
返り値 = preg_match(/正規表現パターン/,検索対象の文字列,[配列],[動作フラグ],[検索開始位置])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $ptn = "/^0[0-9]{1,3}-[0-9]{2,4}-[0-9]{3,4}$/"; $tel_str = "090-0000-0000"; $result = ""; if (preg_match("$ptn", $tel_str)) { $result = "マッチしました。"; } else { $result = "マッチしませんでした。"; } header("Content-type: text/html; charset=utf-8"); echo $tel_str."は、電話番号のパターンに".$result; ?> |
変数「$tel_str」の値を変えて確認してみましょう。
次は、指定した正規表現でマッチした文字列の置換を行う「preg_replace」で動作確認します。
preg_replace関数は、第一引数に正規表現を指定し、第二引数に置換後の文字列、第三引数に置換対象の文字列を指定します。
返り値 = preg_replace( /正規表現パターン/ , $置換後の文字列 , $置換対象の文字列 )
戻り値は、置換後の文字列を返します(マッチしなかった場合はそのままの文字列)。
1 2 3 4 5 6 7 8 9 |
<?php $ptn = "/0[0-9]{1,3}-[0-9]{2,4}-[0-9]{3,4}/"; $tel_str = "お問い合わせは、「000-0000-0000」こちらまで"; $result = preg_replace($ptn,"090-9999-9999",$tel_str); header("Content-type: text/html; charset=utf-8"); echo $result; ?> |
結果を出力して確認してください。