正規表現 実用編

preg_matchを使った実用的な正規表現

正規表現を用いたバリデーション

ID、パスワード

PHP

// ID 半角英数アンスコ 4文字以上 if (! preg_match('/^[A-Za-z0-9\_]{4,}\z/', $str)) { // エラー } // パスワード 半角英数 8~32文字 if (! preg_match('/^[A-Za-z0-9]{8,32}\z/', $str)) { // エラー }

番号

PHP

// 郵便番号 123-4567 if (! preg_match('/^(00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})-[0-9]{4}\z/', $str)) { // エラー } // 1234567(ハイフンなし) if (! preg_match('/^(00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})[0-9]{4}\z/', $str)) { // エラー } // 電話、FAX 012-345-6789 if (! preg_match('/^0[1-9][0-9]{0,3}-[0-9]{1,4}-[0-9]{3,4}\z/', $str) || ! preg_match('/^0[1-9][0-9\-]{5,6}-[0-9]{3,4}\z/', $str)) { // エラー } // 0123456789(ハイフンなし) if (! preg_match('/^0[1-9][0-9]{8,9}\z/', $str)) { // エラー } // 携帯番号 090-1234-5678 if (! preg_match('/^0[7-9]0-[0-9]{4}-[0-9]{4}\z/', $str)) { // エラー } // 09012345678(ハイフンなし) if (! preg_match('/^0[7-9]0[0-9]{8}\z/', $str)) { // エラー }

日付

PHP

// 日付 2024/04/19 if (! preg_match('/^(19|20)\d{2}\/(0?[1-9]|1[0-2])\/(0?[1-9]|(1|2)\d|3(0|1))\z/', $str)) { // エラー } else { // 日付妥当性 list($year, $month, $day) = explode('/', $str); if (! checkdate($month, $day, $year)) { // エラー } // 範囲 if ($year < 1950 || $year > 2024) { // エラー } } } // 時間 10:10 if (! preg_match('/^((0|1)\d|2[0-3]):[0-5]\d\z/', $str)) { // エラー }

URL

PHP

$url_flg = TRUE; $arrUrl = @parse_url($str); if ($arrUrl == FALSE) { $url_flg = FALSE; } else { if (! preg_match('/^https?$/', $arrUrl['scheme'])) { $url_flg = FALSE; } // ホスト名は255文字以内 if (strlen($arrUrl['host']) > 255) { $url_flg = FALSE; } else { $arrDomain = explode('.', $arrUrl['host']); if (! empty($arrDomain)) { foreach($arrDomain as $arrDomainVal) { // ラベル名は63文字以内 if (! preg_match('/^[a-z0-9\x2d]{1,63}\z/i', $arrDomainVal)) { $url_flg = FALSE; // ハイフン始端終端はエラー } elseif (preg_match('/^(-(.*)|(.*)-)\z/', $arrDomainVal)) { $url_flg = FALSE; } if ($url_flg == FALSE) { break; } } } } if (isset($arrUrl['path'])) { if (! preg_match('/^[\x21-\x7e]+\z/', $arrUrl['path'])) { $url_flg = FALSE; } } if (isset($arrUrl['query'])) { if (! preg_match('/^[\x21-\x7e]+\z/', $arrUrl['query'])) { $url_flg = FALSE; } } if (isset($arrUrl['fragment'])) { if (! preg_match('/^[\x21-\x7e]+\z/', $arrUrl['fragment'])) { $url_flg = FALSE; } } } if ($url_flg == FALSE) { // エラー }

検証フィルタを使う

PHP

if(! filter_var($str, FILTER_VALIDATE_URL)){ // エラー }

メールアドレス

PHP

$email_flg = TRUE; // メールアドレスは256文字以内 if (strlen($str) > 256) { $email_flg = FALSE; } elseif (! preg_match('/^(.+)@([^@]+)\z/', $str, $matches)) { $email_flg = FALSE; } else { $local = $matches[1]; $host = $matches[2]; // ローカルは64文字以内 if (! preg_match('/^[\x20-\x7e]{1,64}\z/', $local)) { $email_flg = FALSE; // ドット始端終端はエラー } elseif (preg_match('/^(\.(.*)|(.*)\.)\z/', $local)) { $email_flg = FALSE; // dot_atm形式 ローカルが""でくくられていない、quoted-string形式 ローカルが""でくくられている } elseif (! preg_match('/^\x22(.*)\x22\z/', $local)) { // 半角英数 ! # $ % & ' * + - / = ? ^ _ ` { | } ~ . if (! preg_match('/^[\x21\x23-\x27\x2a\x2b\x2d-\x39\x3d\x3f\x41-\x5a\x5e-\x7e]+\z/', $local)) { $email_flg = FALSE; // ドットが連続はエラー } elseif (preg_match('/(\.){2,}/', $local)) { $email_flg = FALSE; } } // ドメインは255文字以内 if (! preg_match('/^[\x21-\x7e]{1,255}\z/', $host)) { $email_flg = FALSE; } else { $arrDomain = explode('.', $host); if (! empty($arrDomain)) { foreach($arrDomain as $arrDomainVal) { // ラベル名は63文字以内 if (! preg_match('/^[a-z0-9\x2d]{1,63}\z/i', $arrDomainVal)) { $email_flg = FALSE; // ハイフン始端終端はエラー } elseif (preg_match('/^(-(.*)|(.*)-)\z/', $arrDomainVal)) { $email_flg = FALSE; } if ($email_flg == FALSE) { break; } } } } } if ($email_flg== FALSE) { // エラー }

検証フィルタを使う

PHP

if(! filter_var($str, FILTER_VALIDATE_EMAIL)){ // エラー }

補足としてURLとメールアドレスのバリデーションを一読ください。

最新の記事

プロフィール

流されるままにウェブ業界で仕事しています。主にLAPP環境でPHPを書いています。最近はjQueryで遊んでいます。
※動作確認について