お問い合わせフォームをよく作成する機会があるのですが、電話番号やメールチェックの際の正規表現なんだっけ?ってことがよくあるので….メモします。
正規表現とは?
特別なルールで決められた特別な文字の組み合わせを使って実現させる式のことです。
例えば「電話番号は03-1111-0000」という文章の中からハイフンを省いた電話番号半角数字だけを抜き取りたいとした場合、プログラムが判断できるようにしたのが正規表現です。
それを応用することで、ある文字列が数字なのかアルファベットなのか、電話番号かどうか、メールアドレスかどうか、URLかどうか、など、様々なパターンで判定(チェック)することが出来ます。
リファレンス
よく使われる正規表現の一覧です。
^ | 行頭にマッチする | 例:1、^hello。行頭にhelloの文字列はこのパターンにマッチする。 |
$ | 行末にマッチする | 例:1、hello$。行末にhelloの文字列はこのパターンにマッチする。 |
. | 改行以外の任意の1文字にマッチする | 例:1、hello.world。hello worldやhello-worldなどの文字列はこのパターンにマッチする。 |
[] | 角括弧内の任意の1文字にマッチする | 例:1、[abc]。aかb、cはこのパターンにマッチする。
2,r[aeu]d。radやred、rudはこのパターンにマッチする。 |
[A-Z] | 英大文字A-Zの任意1文字にマッチする | 例:1、a[A-Z]c。aAc,aBc,…,aZcなどの文字列はこのパターンにマッチする。 |
[a-z] | 英小文字a-zの任意1文字にマッチする | 例:1、a[a-z]c。aac,abc,…,azcなどの文字列はこのパターンにマッチする。 |
[0-9] | 数字0-9の任意1文字にマッチする | 例:1、a[0-9]c。a0c,a1c,…,a9cなどの文字列はこのパターンにマッチする。 |
[^] | 角括弧内に含まれない1文字にマッチする | 例:1、[^abc]。a、b、c以外の文字はこのパターンにマッチする。 |
* | 直前の表現を0回以上繰り返す | 例:a、ab、abb、abbbなどはマッチする。 |
+ | 直前の表現を1回以上繰り返す | 例:ab、abb、abbbなどの文字列はこのパターンにマッチする。 |
? | 直前の表現を0回または1回繰り返す | 例:1、ab?。aとabはこのパターンにマッチする。 |
{n} | 直前の表現をn回繰り返す。nは整数。 | 例:1、ab{2}。abbはこのパターンにマッチする。 |
{n,} | 直前の表現をn回以上繰り返す。nは整数。 | 例:1、ab{2,}。abb、abbbなどはこのパターンにマッチする。 |
{n,m} | 直前の表現をn回からm回まで繰り返す。n,mは整数。 | 例:1、ab{2,5}。abb,abbb,abbbb,abbbbbはこのパターンにマッチする。 |
a|b | aまたはbにマッチする | 例:1、hello|world。helloまたworldはこのパターンにマッチする。 |
() | グループ化。()内のパターンは(グループ)と見なされる。このグループに一致する文字列を記憶する。1,2..などの数字によるグループへのアクセスできる。 | |
[あ-ん] | ひらがなの1文字にマッチする。 | 例:1、”あいう”.matches(“[あ-ん]*”)。trueを返す。 |
文字クラス[]
[]を文字クラスと呼び、囲まれた文字のどれか1文字にマッチする表現となります。[12]という正規表現の場合は、1か2にマッチします。
[123456]
とすると1、2、3、4、5、6のいずれかということになります。
一括で範囲を指定
さらに[]の中で、-を使うと範囲を指定できます。。たとえば、[a-g]とした場合は、a、b、c、d、e、f、gにマッチします。
[0-9] 0〜9のいずれか1文字にマッチ
[a-zA-Z0-9] 01〜9ab〜zAB〜Zのいずれか1文字にマッチ
否定する
文字クラスの中で^を使うと否定になります。
[^a-z] a〜z以外の1文字にマッチする。
量指定子
量指定子と呼ばれるものが4つあります。
これはその前の要素を何個繰り返すか?という指定です。
?
「?」は直前の要素が0個か1個の場合にマッチします。
https?
直前のsに対してマッチするので、httpかhttpsがマッチ対象となります。
*
アスタリスク「*」は直前の要素が0個以上繰り返し存在する場合にマッチします。
go*d
oに対してマッチしようとするので、godやgdやgoodがマッチします。
+
「+」は直前の要素が1個以上繰り返し存在する場合にマッチします。
o+
oという文字が1個以上連続する場合なのでgodやgoodやgoooodにマッチします。
{n} {n,} {m,n}
直前の要素の繰り返しの数を指定します。
a{5}
aが5個繰り返されるので、aaaaaにマッチします。
a{1,3}
aやaaやaaaにマッチする。
a{1,}
aが1以上繰り返されるものにマッチします。
電話番号をチェックする
入力された情報が電話番号かどうかをチェックする場合、以下の様なプログラムを記述。
$tel=03-1111-0000 $telcheck=$tel; if(preg_match("/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/", $telcheck)) { $telcheck_num=ok; } else { $telcheck_num=ng; }
電話番号($tel)が半角数字かどうかかつ桁が正しいかどうかをpreg_match(“/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/”, $telcheckでチェックして、正しい場合は$telcheck_numにokを代入しています。正しくない場合はngを代入しています。
メールアドレスをチェックする
入力された情報がメールアドレスかどうかをチェックする場合、以下の様なプログラムを記述。
$mail=sample@rootstyledesign.com if (preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $mail)) { $mailcheck_num=1; }else{ $mailcheck_num=2; }
メールアドレス($mail)がメールのフォーマットにあってるかどうかをpreg_match(‘|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|’, $mailでチェックし、正しい場合は$mailcheck_numにokを代入しています。正しくない場合はngを代入しています。
サンプル
郵便番号 if (preg_match('/^[0-9]{3}-[0-9]{4}$/', $str)) {} 電話番号 if (preg_match('/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/', $str)){} Emailアドレスif (preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $str)) {}
とここまでメモしたが、イマイチピンときていない…
また勉強します。