正規表現 実用編
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/12/04
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とメールアドレスのバリデーションを一読ください。