- 更新日: 2019年06月27日
- 公開日: 2016年01月18日
メールアドレスから電話番号まで!知っておきたいPHP正規表現6選
正規表現は文字列の置換や検索などに用いられますが、特に利用する機会が多いのがWebアプリケーションにおける入力事項の妥当性チェックです。今回はフォーム入力時に役に立つ正規表現のサンプルや使い方についてご紹介します。
正規表現とは
正規表現とは、規則性のある文字列の集合を表記法に基いてひとつの文字列で表したものです。プログラム言語で文字列を抽出する場合に用いられるほか、Webアプリケーションでは正規表現とマッチングさせることにより、入力フォームから送られたデータが妥当なものであるかチェックする場合に利用されます。PHPではpreg_matchという関数で正規表現とマッチングを行うことができます。
正規表現を利用したマッチング方法
preg_matchを使い、マッチングを行うには、
preg_match("/検索パターンを表す文字列/", 比較文字列)
のように記述し、条件分岐を行います。データチェックの場合には、マッチする場合には通し、マッチしない場合にはエラーを返すようにします。半角数字のみであるかチェックしたい場合には以下のように記述します。
if (preg_match("/^[0-9]+$/", $number)) {
$number = $number;
}else{
$error = 'not number';
}
正規表現の例
メールアドレス
メールアドレスは正規表現を使用して完全に正しいかどうかチェックすることはできませんが、ある程度の簡易的チェックを行うことは可能です。RFC5322には違反していますが、入力フォームなどでミスをチェックする場合などに利用することができる正規表現の例を紹介します。
/^[a-zA-Z0-9_.+-]+[@][a-zA-Z0-9.-]+$/
この正規表現の例では半角英数字および「_.+-」から始まる文字列を1回以上繰り返し、@の後半角英数字およびドットハイフンを含む文字列を1回以上繰り返し行末としたものを通します。メールアドレスに使用できる文字を完全に規定できませんが、用途に応じて@前後の文字をマッチングさせてチェックします。RFC規定では例えばローカル部に「*!#$%&’/=?^`{|}」などの記号も使用可能ですが、サーバー側でメールアドレス作成時に許可されていない事もあるので採用していません。逆に違反しているローカル部最初と最後のドットや連続ドットも通してしまいますのであくまで簡易用途です。
もっと割り切った例では、
/^[^@]+@[^@]+$/
@以外の文字から始まり@と@以外の一文字以上で終わるといった正規表現もありますが、全角文字まで通してしまうというデメリットも発生してしまいます。
電話番号
数字の桁数から電話番号として妥当かどうかチェックしています。ハイフンありとしています。
/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/
0~9の文字が2~4回繰り返された後ハイフン、0~9の文字が2~4回繰り返された後ハイフン、0~9の文字が3~4回繰り返され行末。[0-9]は\dでも可能です。
00-0000-0000、000-000-0000、0000-00-0000、0000-000-000などを通します。
郵便番号
こちらも桁数およびハイフンの組み合わせによってチェックします。
ハイフンを含む場合
/^[0-9]{3}-[0-9]{4}$/
0~9の文字が3回繰り返された後ハイフンがあり、0~9の文字の4回繰り返された後行末とした例です。
ハイフンなしを許容する場合
/^(([0-9]{3}-[0-9]{4})|([0-9]{7}))$/
0~9の文字が3回繰り返された後ハイフンがあり、0~9の文字の4回繰り返された後行末、もしくは0~9の文字が7回繰り返され行末とした例です。
IDやパスワードなど
IDやパスワードなどに使われる、半角英数のみのチェックを行います。
/^[a-zA-Z0-9]{6,8}+$/
半角英数を6~8回繰り返し行末とした例です。
URL
http、https、ftpの後に://、URLで使用可能な文字列が使われているかチェックします。
/^(https?|ftp)(://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)$/
こちらもRFC3986定義以外のものを通してしまいますのであくまでも簡易的なチェック用途です。
全角文字のチェック
名前や住所、質問といった入力フォームに全角を含んでいるかチェックします。日本語が使用されているか判断の目安になります。
mb_regex_encoding("UTF-8");
if (preg_match("/^[ぁ-んァ-ヶー一-龠]+$/u",$name)) {
$name = $name;
}else{
$error = '日本語を使用してください';
}
UTF-8でのエンコードを許可し、
対象文字列は、デリミタ(/)の後にu(修正子)をつけUTF-8に規定します。
\Webサイト担当者としてのスキルが身に付く/
まとめ
正規表現は万能ではありませんが多くの文字列を扱う場合の効率化には欠かせません。正規表現はたくさんのサンプルを見つけることができますが、マスターするには実際に正規表現を書きながら動作確認を行っていくとよいでしょう。
- この記事を書いた人
- Musettewalzer