こんにちは。いつもお世話になります。
今回は、メールアドレスのチェックについて教えてください。
簡単な正規表現によるチェックは、いくつかのサイトで見かけるのですが、
もう少しアレンジしたくて投稿しました。
一発でチェックする正規表現より、まず原始的な方法で考えました。
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つ連記される場合は存在しますか?
まずは、これだけ教えて下さい。
どうか、よろしくおねがいします。
No.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;
}
}
どうもありがとうございます。
凄いと思いました。究極だと思います。
テストしましたが、おっしゃるようにかなり負担が大きいです。
通常のメールチェックでは云われるように使わない方が無難ですね。
使うにしてもネストさせた正規表現で通ったものにだけ、
$mxcheck, $hostcheckをさせるやり方になるでしょうか。
もう少し、教えて下さい。
No.2
- 回答日時:
RFC952
http://www.ietf.org/rfc/rfc952.txt
のASSUMPTIONS の部分
アルファベット、数字、マイナスとピリオドで構成される24文字までの文字列で
ピリオドはドメインの区切りとしてだけ利用する
英字で始まり、マイナスまたはピリオドで終わってはならない。
とあります。
このルールでいうと
”英数字に囲まれたハイフン(-)が2つ連記される場合”
というのは、OKですね。
>3つ以上のピリオドは存在しますか?
私もナンセンスだと思います。
存在するかも知れないし、あっても別におかしくない。
お礼が遅れましてどうもすみません。
ありがとうございます。ずっと考えていました。
確かに@以下のピリオドで判断するのはナンセンスですね。
http://www.yourname.ne.nu/だと、8.8.8.8.8.8.8のも
登録できるようだし。1発の正規表現でチェックできるものでも
なさそうだし、考える事自体ナンセンスに思えてきました。
No.1
- 回答日時:
1.
何段階まで子ドメインを作れるのかが決まっているのか私は知りませんが、
決まっていたとしても256段階とか、そんなオーダーだと思いますよ。きっと。
ピリオドの数でメールアドレスの正当性を検証するのはナンセンスだと思います。
経験則でピリオド3つとかじゃなくて、仕様書を探すべきだと思います。
2.
ちょっと調べた感じだと RFC1035
(例えばhttp://www.faqs.org/rfcs/rfc1035.html)
の 2.3.1 Preferred name sysntax のところなんかが参考になるかも。
preferredとか言っているので曖昧ですが、
ここに書いてある範囲で、--は許されるようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- UNIX・Linux bash環境でのエラー対応をお願い致します。 1 2022/11/26 17:41
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- 数学 正規数の定義で分からないことがあります。 正規数の定義について専門書において 「xがr進正規であると 1 2023/07/17 20:50
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- その他(言語学・言語) 外国語問題 1 2022/07/21 15:21
- JavaScript ソースコードは下の共有コードサイト「張り紙」にあります。 入力フォームの javascript で 1 2022/05/11 11:01
- 英語 複数形を含む単語がハイフンで繋がれ形容詞化した表現の文法規則について 2 2022/12/13 12:17
- その他(教育・科学・学問) 英文校正についての質問 1 2022/06/14 14:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現の「^」と「$」がうま...
-
php 指定文字列以降の削除
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
フォントの色を変えるには?
-
.htaccessにphp_valueが使用できな
-
パースエラーとは?
-
インクルードした部分が表示さ...
-
PHPでの複数ファイル出力
-
フォームで戻った際に入力済み...
-
.phpと.incファイルの違いはな...
-
phpの処理中に画面表示ををする...
-
2つの画像ファイルが異なるファ...
-
XML-RPCでsend()できない
-
現在位置より2つ上のディレク...
-
【file_exists】ファイルが存在...
-
VBSの「MsgBox」について
-
Smarty includeでテンプレート...
-
mysql複数レコードをまとめて削...
-
WordPressでテーマのヘッダー画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
php 指定文字列以降の削除
-
PHPの変数で最初から2行分の文...
-
^[a-zA-Z_][a-zA-Z0-9_]* でマ...
-
DIRECTORY_SEPARATORについて
-
PHPでurlから第4レベルドメイン...
-
正規表現で「チルダ(~)」をマッ...
-
PHPと正規表現とワイルドカード...
-
正規表現でタグからURLを取り出...
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
index.phpに入るには、どうすれ...
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
PHP8を使うと、大量のWarningが...
-
別ファイルの変数を呼び出した...
-
index.phpって何ですか? 具体...
-
awsにApacheとPHPを入れて、何...
-
Subversionのリポジトリの削除
-
phpでPEAR::DBを使っているので...
-
.phpと.incファイルの違いはな...
おすすめ情報