プロが教えるわが家の防犯対策術!

こんにちは。いつもお世話になります。
今回は、メールアドレスのチェックについて教えてください。
簡単な正規表現によるチェックは、いくつかのサイトで見かけるのですが、
もう少しアレンジしたくて投稿しました。
一発でチェックする正規表現より、まず原始的な方法で考えました。

1)@以下だけ考えます。
$pathmail = explode("@", $email);
$dotcheck = explode(".", $pathmail[1]);
この時のピリオドの回数ですが、現実に下記のようなものはありますか?
xxx@yyy.ccc.aaa.yyy.jjj.ooo.com(.comはgTLDであれば何でもいいです)

僕がいままで出くわした実在するメールアドレスは、
@以下のピリオド数の最高が、xxx@yyy.zzzz.ne.jp と3つでした。

■ 3つ以上のピリオドは存在しますか?

2)1の場合、サブドメインは、yyyだと思いますが、
サブドメインの法則といいますか、それをチェックする正規表現が
あれば、教えて下さい。
特に英数字に囲まれたハイフン(-)が2つ連記される場合は存在しますか?

まずは、これだけ教えて下さい。
どうか、よろしくおねがいします。

A 回答 (3件)

というか、そんな調べ方をしても実在するかどうかは


保障されるわけではありません。
どうせやるなら以下のようにしてみるとよいでしょう。
問題ないなら0を返してきます。
負荷がかかるのでアカウントが有効かどうかまでは
調べてませんが、場合によってはsocketなどでチェック
してみてもよいかも知れません。(個人的には比推奨)

<?php
function checkMail($num) {
if (preg_match("/[^-._~@\w]+/", $num)) return 1;
$hostname = substr($num, strpos($num, "@")+1);
$mxcheck = getmxrr($hostname, $mxhosts);
$hostcheck = ($hostname != gethostbyname($hostname));
if (!$mxcheck and !$hostcheck) return 2;
return 0;
}
?>

参考URL:http://www.php.net/manual/ja/function.getmxrr.php

この回答への補足

次のコードを見てもらえばスキルがわかるでしょうが、
全くの素人です。そこを笑わないでください。
教えて頂きたいのは、コードを改訂整理して欲しいのです。
どうか、おねがいします。
-- mail check function ----------
function checkEmail($num)
{
$pathmail = explode("@", $num);
$hostname = substr($num, strpos($num, "@")+1);
$dot = explode(".", $pathmail[1]);
$error = 0;
if(!preg_match('/\@/',$num)){ $error++; }
if(!preg_match('/^[a-z0-9][a-z0-9\_\.\-]+[^\.]$/i',$pathmail[0])){ $error++; }
if(!preg_match('/^[a-z0-9]/i',$hostname)){ $error++; }
if(preg_match('/_|,|\.[a-z0-9]\.|(\.{2})/i',$hostname)){ $error++; }
//if(!preg_match('/\.[a-z]{2,6}$/i',$hostname)){ $error++; }
if(!preg_match('/\.(com|net|org|...(全部で271)..|zm|zw)$/i',$hostname)){ $error++; }
preg_match('/(ac|co|go|or|ad|ne|gr|ed|lg)\.jp$/i',$hostname,$jptld);
preg_match('/(co|me|org)\.uk$/i',$hostname,$uktld);
if(preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $hostname)){
for($i=0; $i<4; $i++){
if($dot[$i] < 0 || $dot[$i] > 255){ $error++; }
}
}
if($dot[2] == ''){
if(!preg_match('/[a-z0-9-]+/',$dot[0]) || preg_match('/-$/',$dot[0])){ $error++; }
if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[0])){ $error++; }
}elseif($dot[3] == ''){
if($jptld || $uktld){
if(!preg_match('/[a-z0-9-]+/',$dot[0]) || preg_match('/-$/',$dot[0])){ $error++; }
if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[0])){ $error++; }
}else{
if(!preg_match('/[a-z0-9-]+/',$dot[1]) || preg_match('/-$/',$dot[1])){ $error++; }
if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[1])){ $error++; }
}
}elseif($dot[4] == ''){
if($jptld || $uktld){
if(!preg_match('/[a-z0-9-]+/',$dot[1]) || preg_match('/-$/',$dot[1])){ $error++; }
if(preg_match('/^([a-z0-9]{0,2})(-{3})/i',$dot[1])){ $error++; }
}
}
if($error == 0){
return true;
}else{
return false;
}
}

補足日時:2006/08/05 14:35
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
凄いと思いました。究極だと思います。
テストしましたが、おっしゃるようにかなり負担が大きいです。
通常のメールチェックでは云われるように使わない方が無難ですね。
使うにしてもネストさせた正規表現で通ったものにだけ、
$mxcheck, $hostcheckをさせるやり方になるでしょうか。
もう少し、教えて下さい。

お礼日時:2006/08/05 14:35

RFC952


http://www.ietf.org/rfc/rfc952.txt
のASSUMPTIONS の部分
アルファベット、数字、マイナスとピリオドで構成される24文字までの文字列で
ピリオドはドメインの区切りとしてだけ利用する
英字で始まり、マイナスまたはピリオドで終わってはならない。
とあります。
このルールでいうと
”英数字に囲まれたハイフン(-)が2つ連記される場合”
というのは、OKですね。

>3つ以上のピリオドは存在しますか?
私もナンセンスだと思います。
存在するかも知れないし、あっても別におかしくない。
    • good
    • 0
この回答へのお礼

お礼が遅れましてどうもすみません。
ありがとうございます。ずっと考えていました。
確かに@以下のピリオドで判断するのはナンセンスですね。
http://www.yourname.ne.nu/だと、8.8.8.8.8.8.8のも
登録できるようだし。1発の正規表現でチェックできるものでも
なさそうだし、考える事自体ナンセンスに思えてきました。

お礼日時:2006/08/05 14:25

1.


何段階まで子ドメインを作れるのかが決まっているのか私は知りませんが、
決まっていたとしても256段階とか、そんなオーダーだと思いますよ。きっと。
ピリオドの数でメールアドレスの正当性を検証するのはナンセンスだと思います。
経験則でピリオド3つとかじゃなくて、仕様書を探すべきだと思います。

2.
ちょっと調べた感じだと RFC1035
(例えばhttp://www.faqs.org/rfcs/rfc1035.html)
の 2.3.1 Preferred name sysntax のところなんかが参考になるかも。
preferredとか言っているので曖昧ですが、
ここに書いてある範囲で、--は許されるようです。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
お礼が遅れまして申し訳ありません。
ちょっと考えていました。

お礼日時:2006/08/05 14:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!