実コードです。
後で修正いれる可能性があるんで、気づいた事とかあったら突っ込んでくださいませ。
<?php // http://phpspot.net/php/pg%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%EF%BC%9A%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E8%AA%BF%E3%81%B9%E3%82%8B.html function phpspot($text) { if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $text)) { return true; } else { return false; } } // http://www.ideaxidea.com/archives/2009/03/practical_php_regexs.html function idea($email) { if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$email)) { return true; } else { return false; } } //http://qiita.com/tabo_purify/items/aa279cd28abdeba0873c function tabo_purify($mail) { if (preg_match('|^[0-9a-z_./?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$|', $mail)) { return true; }else{ return false; } } function doli($email) { if ( preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/i', $email) ){ return true; } else { return false; } } // http://www.seesaa.hitsug.net/article/406595659.html function seesaa($email){ if(preg_match('/^[a-zA-Z0-9_.!~*\'();\/?:\&=+\$,%#-]+@[A-Za-z0-9_.-]+\.[A-Za-z0-9]+$/', $email)){ return true; } else { return false; } } // http://d.hatena.ne.jp/yachin29/20130410/p1 function yachin29($email){ if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)) { return true; } else { return false; } } // http://doremi.s206.xrea.com/php/tips/preg.html function doremi_1($email) { if (preg_match('/^[\w\-\.]+@[\w\-\.]+$/D', $email)) { return true; } //else return false; } function doremi_2($email) { if (preg_match('/^\w+(?:[\.\-]\w+)*@\w+(?:-\w+)?(?:\.\w+(?:-\w+)?)+$/D', $email)) { return true; } //else return false; } // http://qiita.com/mpyw/items/257eabe0b43b1e02e6f7 function mpyw($email, $strict = true) { $dot_string = $strict ? '(?:[A-Za-z0-9!#$%&*+=?^_`{|}~\'\\/-]|(?<!\\.|\\A)\\.(?!\\.|@))' : '(?:[A-Za-z0-9!#$%&*+=?^_`{|}~\'\\/.-])' ; $quoted_string = '(?:\\\\\\\\|\\\\"|\\\\?[A-Za-z0-9!#$%&*+=?^_`{|}~()<>[\\]:;@,. \'\\/-])'; $ipv4_part = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; $ipv6_part = '(?:[A-fa-f0-9]{1,4})'; $fqdn_part = '(?:[A-Za-z](?:[A-Za-z0-9-]{0,61}?[A-Za-z0-9])?)'; $ipv4 = "(?:(?:{$ipv4_part}\\.){3}{$ipv4_part})"; $ipv6 = '(?:' . "(?:(?:{$ipv6_part}:){7}(?:{$ipv6_part}|:))" . '|' . "(?:(?:{$ipv6_part}:){6}(?::{$ipv6_part}|:{$ipv4}|:))" . '|' . "(?:(?:{$ipv6_part}:){5}(?:(?::{$ipv6_part}){1,2}|:{$ipv4}|:))" . '|' . "(?:(?:{$ipv6_part}:){4}(?:(?::{$ipv6_part}){1,3}|(?::{$ipv6_part})?:{$ipv4}|:))" . '|' . "(?:(?:{$ipv6_part}:){3}(?:(?::{$ipv6_part}){1,4}|(?::{$ipv6_part}){0,2}:{$ipv4}|:))" . '|' . "(?:(?:{$ipv6_part}:){2}(?:(?::{$ipv6_part}){1,5}|(?::{$ipv6_part}){0,3}:{$ipv4}|:))" . '|' . "(?:(?:{$ipv6_part}:){1}(?:(?::{$ipv6_part}){1,6}|(?::{$ipv6_part}){0,4}:{$ipv4}|:))" . '|' . "(?::(?:(?::{$ipv6_part}){1,7}|(?::{$ipv6_part}){0,5}:{$ipv4}|:))" . ')'; $fqdn = "(?:(?:{$fqdn_part}\\.)+?{$fqdn_part})"; $local = "({$dot_string}++|(\"){$quoted_string}++\")"; $domain = "({$fqdn}|\\[{$ipv4}]|\\[{$ipv6}]|\\[{$fqdn}])"; $pattern = "/\\A{$local}@{$domain}\\z/"; return preg_match($pattern, $email, $matches) && ( !empty($matches[2]) && !isset($matches[1][66]) && !isset($matches[0][256]) || !isset($matches[1][64]) && !isset($matches[0][254]) ) ; } // http://fdays.blogspot.jp/2007/10/rfc-2822-j0hn-d0e-10-pregmatch-9.html function fdays_1($m) { //local part $atext = "[-!#-'*+/-9=?^-~]"; $atom = $atext . '+'; $dot_atom = $atom . '(//.' . $atom . ')*'; //2 $qtext = '[]-~!#-[]'; $text = '[ -~]'; $quoted_pair = '////' . $text; //4 $quoted_string = '"(' . $qtext . '|' . $quoted_pair . ')*"'; //3 $local_part = '(' . $dot_atom . '|' . $quoted_string . ')'; //domain $label = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?'; //7, 8 $domain = $label . '(//.' . $label . ')*//.([a-z]{2,4}|museum)'; //6 //全体 $addr_spec = $local_part . '@' . $domain; //1 $regexp = '/^' . str_replace('/', '\\/', $addr_spec) . '$/i'; if (preg_match($regexp, $m)) { return true; } //else return false; } function fdays_2($value) { if (preg_match('/^[-+\\w]+(\\.[-+\\w]+)*@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]{2,6}$/i', $value)) { return true; } //else return false; } function fdays_3($value) { if (preg_match('/^[-+.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]{2,6}$/i', $value)) { return true; } //else return false; } // --------------------------------------------- // http://catbot.net/blog/2007/06/re_php.html // ソースは PEARから直接( http://download.pear.php.net/package/Mail-1.3.0.tgz ) function pear($data, $strict = false) { $regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i'; if (preg_match($regex, trim($data), $matches)) { //return array($matches[1], $matches[2]); return true; } else { return false; } } // http://catbot.net/blog/2007/06/re_php.html // 多分こういう関数だと思う define('VALID_EMAIL', '/\\A(?:^([a-z0-9][a-z0-9_\\-\\.\\+]*)@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)\\z/i'); function cake($s) { if (preg_match(VALID_EMAIL, $s, $matches)) { //return array($matches[1], $matches[2]); return true; } else { return false; } } // function Ethna($mailaddress) { if (preg_match('/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i', $mailaddress)) { return true; } return false; } // XXX 第二引数は省略 // XXX classメソッドぽいので、$thisをcallするあたり省略 // ドメインチェックは(今回の趣旨から外れるし)省略 function symfony_1(&$value /*, &$error*/) { return _symfony($value, false); } function symfony_2(&$value /*, &$error*/) { return _symfony($value, true); } function _symfony(&$value, $strict) { $error; // XXX //$strict = $this->getParameterHolder()->get('strict'); if ($strict == true) { $re = '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i'; } else { /* Cal Henderson: http://iamcal.com/publish/articles/php/parsing_email/pdf/ * The long regular expression below is made by the following code * fragment: * * $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'; * $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'; * $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c' * . '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'; * $quoted_pair = '\\x5c\\x00-\\x7f'; * $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d"; * $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22"; * $domain_ref = $atom; * $sub_domain = "($domain_ref|$domain_literal)"; * $word = "($atom|$quoted_string)"; * $domain = "$sub_domain(\\x2e$sub_domain)*"; * $local_part = "$word(\\x2e$word)*"; * $addr_spec = "$local_part\\x40$domain"; */ $re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-' .'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-' .'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' .'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80' .'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29' .'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^' .'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-' .'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-' .'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*' .'\\x5d))*$/' ; } if (!preg_match($re, $value)) { //$error = $this->getParameterHolder()->get('email_error'); return false; } /* $checkDomain = $this->getParameterHolder()->get('check_domain'); if ($checkDomain && function_exists('checkdnsrr')) { $tokens = explode('@', $value); if (!checkdnsrr($tokens[1], 'MX') && !checkdnsrr($tokens[1], 'A')) { $error = $this->getParameterHolder()->get('email_error'); return false; } } */ return true; } // PHP function php_filter($email) { $r = filter_var($email, FILTER_VALIDATE_EMAIL); if (false === $r) { return false; } // else return true; } /* // 未テストだけど本来的にvalid // 「お名前 <アドレス>」は、うち(MagicWeapon)には「引っぺがすメソッド」あるから一旦無視 <foo@example.com> foo <foo@example.com> // 「ドメインpartにIPアドレス指定」は今回の趣旨から外れるから無視 canada@[192.168.0.1] */ // 本来invalid $invalid = [ 'dameexample.com' => '@がない', '.da.me@example.com' => 'local-part先頭の.(ドット)はNG', 'da.me.@example.com' => 'local-part最後の.(ドット)はNG', 'da..me@example.com' => '連続した.(ドット)はNG', 'da.me@.example.com' => 'domain-part先頭の.(ドット)はNG', 'da.me@example.com_' => 'domain-partの最後はアルファベットまたは数字のみ', 'da.me@example.com.' => 'domain-partの最後はアルファベットまたは数字のみ(その2)', 'nobody@add_example.com' => 'domain-partのアンダースコアはNG', ]; // 本来valid $valid = [ 'nobody@example.com' => '普通のアドレス', '0nobody@example.com' => '先頭を数字に', '!nobody@example.com' => '先頭を記号に', 'nobody@1st.example.com' => 'ドメイン名の先頭を数字に(昔は駄目だった)', 'Abc\@def@example.com' => 'quoted pair(ただしこれはobsolete)', "!#$%&'*+-/=?^_`.{|}~@example.com" => '使用可能な記号の群れ', '"da.me.."@example.com' => 'これは「quoted string」なのでvalidなパターンその1', '"nobody@nobody"@example.com' => 'これは「quoted string」なのでvalidなパターンその2', 'nobody+regexp@gmail.com' => 'いわゆる拡張アドレスその1', 'nobody-regexp@gmail.com' => 'いわゆる拡張アドレスその2', '"nobody+regexp"@gmail.com' => 'いわゆる拡張アドレスその3(拡張+quoted)', '"nobody-regexp"@gmail.com' => 'いわゆる拡張アドレスその4(拡張+quoted)', ]; $funcs = [ 'phpspot', 'idea', 'tabo_purify', 'doli', 'seesaa', 'yachin29', 'doremi_1', 'doremi_2', 'mpyw', // 'fdays_1', valid系が全部エラーになるので、一旦未使用にする 'fdays_2', 'fdays_3', 'pear', 'cake', 'Ethna', 'symfony_1', 'symfony_2', 'php_filter', ]; // ぶん回し: メールアドレス単位での「各処理」の具合 foreach(['invalid' => false, 'valid' => true] as $data => $expected_ret) { echo "{$data}\n"; foreach($$data as $email => $comment) { echo " {$email} ({$comment})\n"; foreach ($funcs as $func) { printf(" call %-15s:", $func); $r = $func($email); if ($r === $expected_ret) { echo "... OK!!\n"; } else { echo "... NG orz\n"; } } echo "\n"; } echo "\n\n"; } // ぶん回し:各処理単位での、メアドの具合 // ついでにカウント $count = []; foreach ($funcs as $func) { $count[$func] = ['OK' => 0, 'NG' => 0]; printf("call %-15s\n", $func); foreach(['invalid' => false, 'valid' => true] as $data => $expected_ret) { echo " {$data}\n"; foreach($$data as $email => $comment) { //printf(" %-30s", $email); $r = $func($email); if ($r === $expected_ret) { //echo "... OK!!\n"; $count[$func]['OK'] ++; } else { printf(" %-30s... NG orz(%s)\n", $email, $comment); //echo "... NG orz({$comment})\n"; $count[$func]['NG'] ++; } } } echo "\n"; } // foreach($count as $func => $types) { echo "{$func}\n"; foreach($types as $type => $i) { printf(" %s => %d\n", $type, $i); } }
結果
invalid
dameexample.com (@がない)
call phpspot :... OK!!
call idea :... OK!!
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... OK!!
call doremi_1 :... OK!!
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
.da.me@example.com (local-part先頭の.(ドット)はNG)
call phpspot :... OK!!
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... OK!!
call seesaa :... NG orz
call yachin29 :... OK!!
call doremi_1 :... NG orz
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... OK!!
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... NG orz
call php_filter :... OK!!
da.me.@example.com (local-part最後の.(ドット)はNG)
call phpspot :... NG orz
call idea :... OK!!
call tabo_purify :... NG orz
call doli :... OK!!
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... NG orz
call php_filter :... OK!!
da..me@example.com (連続した.(ドット)はNG)
call phpspot :... NG orz
call idea :... OK!!
call tabo_purify :... NG orz
call doli :... OK!!
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... NG orz
call php_filter :... OK!!
da.me@.example.com (domain-part先頭の.(ドット)はNG)
call phpspot :... OK!!
call idea :... OK!!
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... NG orz
call yachin29 :... OK!!
call doremi_1 :... NG orz
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
da.me@example.com_ (domain-partの最後はアルファベットまたは数字のみ)
call phpspot :... NG orz
call idea :... OK!!
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... NG orz
call symfony_2 :... OK!!
call php_filter :... OK!!
da.me@example.com. (domain-partの最後はアルファベットまたは数字のみ(その2))
call phpspot :... NG orz
call idea :... OK!!
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
nobody@add_example.com (domain-partのアンダースコアはNG)
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... NG orz
call symfony_1 :... NG orz
call symfony_2 :... OK!!
call php_filter :... OK!!
valid
nobody@example.com (普通のアドレス)
call phpspot :... OK!!
call idea :... OK!!
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... OK!!
call doremi_1 :... OK!!
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
0nobody@example.com (先頭を数字に)
call phpspot :... OK!!
call idea :... NG orz
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... OK!!
call doremi_1 :... OK!!
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
!nobody@example.com (先頭を記号に)
call phpspot :... NG orz
call idea :... OK!!
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... OK!!
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... OK!!
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
nobody@1st.example.com (ドメイン名の先頭を数字に(昔は駄目だった))
call phpspot :... OK!!
call idea :... OK!!
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... OK!!
call doremi_1 :... OK!!
call doremi_2 :... OK!!
call mpyw :... NG orz
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
Abc\@def@example.com (quoted pair(ただしこれはobsolete))
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... NG orz
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... NG orz
call symfony_2 :... NG orz
call php_filter :... NG orz
!#$%&'*+-/=?^_`.{|}~@example.com (使用可能な記号の群れ)
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... OK!!
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
"da.me.."@example.com (これは「quoted string」なのでvalidなパターンその1)
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
"nobody@nobody"@example.com (これは「quoted string」なのでvalidなパターンその2)
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... NG orz
call php_filter :... OK!!
nobody+regexp@gmail.com (いわゆる拡張アドレスその1)
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
nobody-regexp@gmail.com (いわゆる拡張アドレスその2)
call phpspot :... OK!!
call idea :... NG orz
call tabo_purify :... OK!!
call doli :... OK!!
call seesaa :... OK!!
call yachin29 :... OK!!
call doremi_1 :... OK!!
call doremi_2 :... OK!!
call mpyw :... OK!!
call fdays_2 :... OK!!
call fdays_3 :... OK!!
call pear :... OK!!
call cake :... OK!!
call Ethna :... OK!!
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
"nobody+regexp"@gmail.com (いわゆる拡張アドレスその3(拡張+quoted))
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
"nobody-regexp"@gmail.com (いわゆる拡張アドレスその4(拡張+quoted))
call phpspot :... NG orz
call idea :... NG orz
call tabo_purify :... NG orz
call doli :... NG orz
call seesaa :... NG orz
call yachin29 :... NG orz
call doremi_1 :... NG orz
call doremi_2 :... NG orz
call mpyw :... OK!!
call fdays_2 :... NG orz
call fdays_3 :... NG orz
call pear :... NG orz
call cake :... NG orz
call Ethna :... NG orz
call symfony_1 :... OK!!
call symfony_2 :... OK!!
call php_filter :... OK!!
call phpspot
invalid
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
da.me@example.com_ ... NG orz(domain-partの最後はアルファベットまたは数字のみ)
da.me@example.com. ... NG orz(domain-partの最後はアルファベットまたは数字のみ(その2))
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
nobody+regexp@gmail.com ... NG orz(いわゆる拡張アドレスその1)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call idea
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
0nobody@example.com ... NG orz(先頭を数字に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
nobody+regexp@gmail.com ... NG orz(いわゆる拡張アドレスその1)
nobody-regexp@gmail.com ... NG orz(いわゆる拡張アドレスその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call tabo_purify
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
nobody+regexp@gmail.com ... NG orz(いわゆる拡張アドレスその1)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call doli
invalid
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call seesaa
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
da.me@.example.com ... NG orz(domain-part先頭の.(ドット)はNG)
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call yachin29
invalid
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
da.me@example.com_ ... NG orz(domain-partの最後はアルファベットまたは数字のみ)
da.me@example.com. ... NG orz(domain-partの最後はアルファベットまたは数字のみ(その2))
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
nobody+regexp@gmail.com ... NG orz(いわゆる拡張アドレスその1)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call doremi_1
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
da.me@.example.com ... NG orz(domain-part先頭の.(ドット)はNG)
da.me@example.com_ ... NG orz(domain-partの最後はアルファベットまたは数字のみ)
da.me@example.com. ... NG orz(domain-partの最後はアルファベットまたは数字のみ(その2))
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
nobody+regexp@gmail.com ... NG orz(いわゆる拡張アドレスその1)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call doremi_2
invalid
da.me@example.com_ ... NG orz(domain-partの最後はアルファベットまたは数字のみ)
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
nobody+regexp@gmail.com ... NG orz(いわゆる拡張アドレスその1)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call mpyw
invalid
valid
nobody@1st.example.com ... NG orz(ドメイン名の先頭を数字に(昔は駄目だった))
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
call fdays_2
invalid
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call fdays_3
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call pear
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
valid
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call cake
invalid
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call Ethna
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
!nobody@example.com ... NG orz(先頭を記号に)
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
!#$%&'*+-/=?^_`.{|}~@example.com... NG orz(使用可能な記号の群れ)
"da.me.."@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその1)
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
"nobody+regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその3(拡張+quoted))
"nobody-regexp"@gmail.com ... NG orz(いわゆる拡張アドレスその4(拡張+quoted))
call symfony_1
invalid
da.me@example.com_ ... NG orz(domain-partの最後はアルファベットまたは数字のみ)
nobody@add_example.com ... NG orz(domain-partのアンダースコアはNG)
valid
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
call symfony_2
invalid
.da.me@example.com ... NG orz(local-part先頭の.(ドット)はNG)
da.me.@example.com ... NG orz(local-part最後の.(ドット)はNG)
da..me@example.com ... NG orz(連続した.(ドット)はNG)
valid
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
"nobody@nobody"@example.com ... NG orz(これは「quoted string」なのでvalidなパターンその2)
call php_filter
invalid
valid
Abc\@def@example.com ... NG orz(quoted pair(ただしこれはobsolete))
phpspot
OK => 7
NG => 13
idea
OK => 9
NG => 11
tabo_purify
OK => 9
NG => 11
doli
OK => 13
NG => 7
seesaa
OK => 9
NG => 11
yachin29
OK => 7
NG => 13
doremi_1
OK => 5
NG => 15
doremi_2
OK => 10
NG => 10
mpyw
OK => 18
NG => 2
fdays_2
OK => 13
NG => 7
fdays_3
OK => 10
NG => 10
pear
OK => 12
NG => 8
cake
OK => 11
NG => 9
Ethna
OK => 9
NG => 11
symfony_1
OK => 17
NG => 3
symfony_2
OK => 15
NG => 5
php_filter
OK => 19
NG => 1