javascript - 表現 - メール アドレス rfc チェック




JavaScriptでメールアドレスを検証する方法は? (20)

電子メールアドレスをJavaScriptでどのように検証できますか?


TLDの存在をチェックしないソリューションは不完全です。

この質問に対するほとんどの回答は、Regexを使って電子メールアドレスを検証することを提案しています。 Regexは初歩的な検証にしか役に立たないと思います。 電子メールアドレスの確認の検証は、実際には2つの別々の問題です。

1-電子メール形式の検証:電子メールがRFC 5322の電子メールの形式とパターンに準拠しているかどうか、また実際にTLDが存在するかどうかを確認します。 すべての有効なTLDのリストは、 here

たとえば、アドレス[email protected]は正規表現を渡しますが、 cccはIANAのトップレベルドメインではないため、有効な電子メールではありません。

2-電子メールが実際に存在することを確認する:これを行うには、唯一のオプションユーザーに電子メールを送信することです。


2番目に正規表現を使って電子メールを検証することを理解しなければならないことがあります。 それはおそらく良い考えではありません 。 いったんあなたがその言葉に賛同すれば、そこで途中であなたを得ることができる多くの実装があります。この記事では、それらをうまくまとめています。

要するに、ユーザーが実際に入力したものが実際に電子メールであることを確かめる唯一の方法は、実際に電子メールを送信して何が起こるかを見ることです。 それ以外はすべてがちょうど推測です。


JavaScriptは正規表現にマッチできます:

emailAddress.match( / some_regex /);

電子メールのRFC22正規表現は次のとおりです。

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

RFCに準拠した電子メールアドレスの正しい検証は、1ライナーの正規表現で達成できるものではありません。 私がPHPで見つけたベストソリューションの記事は、有効な電子メールアドレス何ですか? 。 明らかに、Javaに移植されています。 私は、関数がJavaScriptに移植されて使用されるには複雑すぎると思います。 JavaScript / node.jsポート: https://www.npmjs.com/package/email-addresses : https://www.npmjs.com/package/email-addresses

クライアントでデータを検証するが、サーバー上の検証を再確認することをお勧めします。 これを念頭に置いて、文字列がクライアント上の有効な電子メールアドレスのように見えるかどうかをチェックし、サーバーで厳密なチェックを実行するだけです。

以下は、文字列が有効なメールアドレスのように見えるかどうかをチェックするJavaScript関数です:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

説明:

  • lastAtPos < lastDotPos :最後の@は最後のものでなければなりません. @は(私が知る限り)サーバー名の一部にすることはできないからです。

  • lastAtPos > 0 :最後の@前に何か(電子メールのユーザ名)があるはずです。

  • str.indexOf('@@') == -1 :アドレスに@@はないはずです。 @が電子メールのユーザー名の最後の文字として表示されても、 "その@とその最後の@間になるでしょう。

  • lastDotPos > 2 :最後のドットの前に少なくとも3文字、たとえば[email protected]です。

  • (str.length - lastDotPos) > 2 :2文字のドメインを形成するには、最後のドットの後に十分な文字がなければなりません。 大括弧が必要かどうかはわかりません。


Wikipedia標準メール構文:

https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte

function validMail(mail)
{
    return /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()\.,;\[email protected]\"]+\.{0,1})+([^<>()\.,;:\[email protected]\"]{2,}|[\d\.]+))$/.test(mail);
}

// VALID MAILS

validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('user+mailbox/[email protected]') // Return true
validMail('"very.(),:;<>[]\".VERY.\"[email protected]\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email protected]') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"[email protected]"@example.com') // Return true
validMail('"Fred Bloggs"@example.com') // Return true
validMail('"Joe.\\Blow"@example.com') // Return true
validMail('Loïc.Accentué@voilà.fr') // Return true
validMail('" "@example.org') // Return true
validMail('[email protected][IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

validMail('Abc.example.com') // Return false
validMail('[email protected]@[email protected]') // Return false
validMail('a"b(c)d,e:f;g<h>i[j\k][email protected]') // Return false
validMail('just"not"[email protected]') // Return false
validMail('this is"not\[email protected]') // Return false
validMail('this\ still\"not\\[email protected]') // Return false
validMail('[email protected]') // Return false
validMail('[email protected]') // Return false

このテストを表示する:https://regex101.com/r/LHJ9gU/1 : https://regex101.com/r/LHJ9gU/1


うわー、ここにはたくさんの複雑さがあります。 あなたがしたいのは、最も明白な構文エラーをキャッチするだけであれば、私は次のようにします:

\[email protected]\S+

これは通常、ユーザーが行う最も明白なエラーをキャッチし、フォームがほとんど正しいことを保証します。これはJavaScriptの検証がすべてであることを保証します。


これはhttp://codesnippets.joyent.com/posts/show/1917から盗まれました

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

これは、 node-validatorがそれを行う方法です。

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~][email protected](?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/

これまでにRFC5322で確認された最高の正規表現

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])+


これを行う:

[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?

どうして? これはRFC 2822基づいています 。これは標準のすべての電子メールアドレスが守らなければならないものです。

しばしば電子メールアドレスをデータベースに格納するとき、私はそれらを小文字にし、実際には正規表現は通常大文字小文字を区別しないようにすることができます。 これらの場合、これはわずかに短くなります。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

ここでは、JavaScriptで使用されている例を示します(最後に大文字小文字を区別しないフラグiを付けます)。

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('[email protected]') );

注意
技術的には、引用符の中にエスケープ文字を含む@記号の前の部分に引用符を含めることができます(電子メールのユーザーは、引用符で囲まれていれば、 @"..."ようなものを含みます)。 誰もこれまでこれをやっていない! それは時代遅れです。 しかし、それは真のRFC 2822標準に含まれており、ここでは省略されています。

詳細情報: http : //www.regular-expressions.info/email.html


バリデータ関数内で次のコードを使用します。

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

それ以外の場合は、jQueryを使用できます。内側のルールでは、

eMailId: {
    required: true,
    email: true
}

入力された電子メールアドレスが有効かどうかをHTMLで確認してください。

<input type="email"/>

検証のための関数を書く必要はありません。


完全性のために、 別のRFC 2822準拠の正規表現があります

公式の標準はRFC 2822として知られています 。 有効な電子メールアドレスが守らなければならない構文について説明します。 次の正規表現で実装することができます( ただし、 読んで はいけません ):

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

(...)二重引用符と角括弧を使用して構文を省略すると、RFC 2822のより実用的な実装が得られます。 それは今日でも実際に使用されているすべての電子メールアドレスの99.99%と一致します。

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

それ以上の変更は、任意の2文字の国コードトップレベルドメインと特定の一般的なトップレベルドメインのみを許可することです。 この正規表現は、 [email protected]ようなダミーのメールアドレスを[email protected]ます。 新しいトップレベルドメインが追加されると、それを更新する必要があります

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[AZ]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

したがって、公式の基準を守っても、やはりトレードオフがあります。 オンラインライブラリやディスカッションフォーラムから正規表現を盲目的にコピーしないでください。 自分のデータと自分のアプリケーションで常にテストしてください。

重心



現代のブラウザでは、純粋なJavaScriptとDOM使って@ Sushilの答えの上に構築することができDOM

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\[email protected]\S+\.\S+/.test(value);
}

私は、フィドルhttp://jsfiddle.net/boldewyn/2b6d5/例をまとめました。 機能の検出とSquirtle's Answerからのベアボーンの検証とを組み合わせることで、あなたは正規表現の大虐殺から解放され、古いブラウザではボークが実行されません。


私はJaymonの答えを、単純な検証をしたい人のために少し修正しました:

[email protected]

正規表現:

/\[email protected]\S+\.\S+/

JavaScript関数の例:

function validateEmail(email) 
{
    var re = /\[email protected]\S+\.\S+/;
    return re.test(email);
}

私は本当にこの問題を解決することを楽しみにしています。 だから私は上記の電子メールの正規表現の正規表現を変更した

Wikipedia Email Addressの例を渡す。

そしてhere結果を見ることができhere


電子メールバリデータを100%正確に取得するのは難しいです。 それを正しいものにする唯一の本当の方法は、テスト電子メールをアカウントに送ることです。 つまり、合理的なものを手に入れるための基本的なチェックがいくつかあります。

改善すべき点:

新しいRegExp代わりに、次のようにregexp書いてみてください:

if (reg.test(/@/))

次に、ピリオドが@記号の後に来ることを確認し、 @ sとピリオドの間に文字があることを確認します。


正規表現の私の知識はそれほど良いものではありません。そのため、単純な正規表現で一般構文をチェックし、後で他の関数でより具体的なオプションをチェックするのはこのためです。これは最善の技術的解決策ではないかもしれませんが、私はより柔軟で高速な方法です。

私が遭遇した最も一般的なエラーは、スペース(特に、最初と最後)とときどきダブルドットです。

function check_email(val){
    if(!val.match(/\[email protected]\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('[email protected]'); // Returns false
check_email('[email protected]'); // Returns false
check_email(' [email protected]'); // Returns false
check_email('[email protected]'); // Returns true

正規表現を使用して電子メールアドレスを検証する方法については、非常に良い議論です。「http://fightingforalostcause.net/misc/2006/compare-email-regex.php

参照用に、JavaScript対応の現在のトップ式を示します。

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i




email-validation