Overview PHP provides a validation filter for checking the format of email addresses.
You typically use it like this.
1 2 3 4 5 if (filter_var ($email , FILTER_VALIDATE_EMAIL)) { echo '(^-^) OK Email アドレスフォーマットとして妥当' ; } else { echo '(>_<) NG' ; }
The php.net documentation describes it as follows.
http://php.net/manual/ja/filter.filters.validate.php
Validates whether the value is a valid e-mail address. This validation checks whether the e-mail address has a form that conforms to RFC 822. However, it does not support comments and whitespace folding.
Verification
Result 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [OK (^-^) EMAIL LIST] abc@gmail.com a!bc@gmail.com a#bc@gmail.com a$bc@gmail.com a%bc@gmail.com a&bc@gmail.com a`bc@gmail.com a=bc@gmail.com a~bc@gmail.com a~bc@gmail.com a|bc@gmail.com a^bc@gmail.com a*bc@gmail.com a+bc@gmail.com a?bc@gmail.com a`bc@gmail.com a{bc@gmail.com a}bc@gmail.com a}bc@gmail.com !abc@gmail.com #abc@gmail.com $abc@gmail.com %abc@gmail.com &abc@gmail.com =abc@gmail.com ~abc@gmail.com |abc@gmail.com ^abc@gmail.com *abc@gmail.com +abc@gmail.com ?abc@gmail.com `abc@gmail.com {abc@gmail.com }abc@gmail.com a__bc@gmail.com abc_@gmail.com abc@vwx.yz [NG (>_<) EMAIL LIST] a"bc@gmail.com a@bc@gmail.com a(bc@gmail.com a)bc@gmail.com a\bc@gmail.com a:bc@gmail.com a;bc@gmail.com a<bc@gmail.com a>bc@gmail.com a>bc@gmail.com a,bc@gmail.com a[bc@gmail.com a]bc@gmail.com ¥abc@gmail.com "abc@gmail.com @abc@gmail.com (abc@gmail.com )abc@gmail.com \abc@gmail.com :abc@gmail.com ;abc@gmail.com <abc@gmail.com >abc@gmail.com ,abc@gmail.com [abc@gmail.com ]abc@gmail.com a..bc@gmail.com abc.@gmail.com abc@@vwx.yz
It lets through email addresses that you would want to reject as NG.
&abc@xyz.ab
Assessment so far Validation using PHP’s validation filter FILTER_VALIDATE_EMAIL is probably acceptable for email address validation of accounts used in internal company systems.
For a commercial service, however, I felt that relying on the validation filter alone is risky.
My Email validation
Use the validation filter FILTER_VALIDATE_EMAIL as a basic check
Restrict the allowed characters to alphanumeric characters, ., _, and -
Added a DNS validation check by referring to a Qiita article. (Thank you, ShibuyaKosuke !)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function checkEmailwithDNS ($email , $check_dns = false ) { switch (true ) { case !filter_var ($email , FILTER_VALIDATE_EMAIL): case !preg_match ("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/" , $email ): case !preg_match ('/@([\w.-]++)\z/' , $email , $m ): return false ; case !$check_dns : case checkdnsrr ($m [1 ], 'MX' ): case checkdnsrr ($m [1 ], 'A' ): case checkdnsrr ($m [1 ], 'AAAA' ): return true ; default : return false ; } } if (checkEmailDNS ($email , true )) { echo '(^-^) OK Email アドレスフォーマットとして妥当' ; } else { echo '(>_<) NG' ; }
My Email validation verification
Result It rejects almost everything~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [OK (^-^) EMAIL LIST] abc@gmail.com a__bc@gmail.com abc_@gmail.com [NG (>_<) EMAIL LIST] a!bc@gmail.com a"bc@gmail.com a@bc@gmail.com a#bc@gmail.com a$bc@gmail.com a%bc@gmail.com a&bc@gmail.com a`bc@gmail.com a(bc@gmail.com a)bc@gmail.com a=bc@gmail.com a~bc@gmail.com a~bc@gmail.com a|bc@gmail.com a\bc@gmail.com a^bc@gmail.com a:bc@gmail.com a;bc@gmail.com a*bc@gmail.com a+bc@gmail.com a?bc@gmail.com a<bc@gmail.com a>bc@gmail.com a>bc@gmail.com a,bc@gmail.com a`bc@gmail.com a[bc@gmail.com a]bc@gmail.com a{bc@gmail.com a}bc@gmail.com a}bc@gmail.com ¥abc@gmail.com !abc@gmail.com "abc@gmail.com @abc@gmail.com #abc@gmail.com $abc@gmail.com %abc@gmail.com &abc@gmail.com (abc@gmail.com )abc@gmail.com =abc@gmail.com ~abc@gmail.com |abc@gmail.com \abc@gmail.com ^abc@gmail.com :abc@gmail.com ;abc@gmail.com *abc@gmail.com +abc@gmail.com ?abc@gmail.com <abc@gmail.com >abc@gmail.com ,abc@gmail.com `abc@gmail.com [abc@gmail.com ]abc@gmail.com {abc@gmail.com }abc@gmail.com a..bc@gmail.com abc.@gmail.com abc@@vwx.yz abc@vwx.yz
References Isn’t it about time we stopped checking email addresses with regular expressions alone?
That’s all.