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


Answers

完全性のために、 別の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文字の国コードトップレベルドメインと特定の一般的なトップレベルドメインのみを許可することです。 この正規表現は、 asdf@adsf.adsfようなダミーのメールアドレスをasdf@adsf.adsfます。 新しいトップレベルドメインが追加されると、それを更新する必要があります

[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

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

重心

Question

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




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

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

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

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

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




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)>)$



すべてのメールアドレスには「at」(つまり@)記号が含まれています。 必要な条件をテストする:

email.indexOf("@") > 0

もっと複雑なもので気にしないでください。 電子メールがRFC構文上有効かどうかを完全に判断できたとしても、それがそれを提供した人に属しているかどうかは分かりません。 それが本当に重要です。

これをテストするには、検証メッセージを送信します。




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

  • 元の
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

  • 変更された
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

Wikipedia Email Addressの例を渡す。

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




My knowledge of regular expressions is not that good. That's why I check the general syntax with a simple regular expression first and check more specific options with other functions afterwards. This may not be not the best technical solution, but this way I'm way more flexible and faster.

The most common errors I've come across are spaces (especially at the beginning and end) and occasionally a double dot.

function check_email(val){
    if(!val.match(/\S+@\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('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true



Sectrean's solution works great, but it was failing my linter . So I added some escapes:

function validateEmail(email){ 
     var re = /^(([^<>()[]\\.,;:\s@\"]+(\.[^<>()[]\\.,;:\s@\"]+)*)|(\".+\"))@(([[0-9]{1,3}\‌​.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
     return re.test(email); 
}



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

改善すべき点:

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

if (reg.test(/@/))

Second, check to make sure that a period comes after the @ sign, and make sure that there are characters between the @ s and periods.




これを行う:

[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('some.body@domain.co.uk') );

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

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




HTML5自体に電子メールの検証があります。 ブラウザがHTML5をサポートしている場合は、次のコードを使用できます。

<form><input type="email" placeholder="me@example.com">
    <input type="submit">
</form>

jsFiddleリンク

HTML5仕様から:

有効な電子メールアドレスは、次のABNFのemail制作に一致する文字列で、その文字セットはUnicodeです。

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

この要件は、あまりにも厳しい( "@"文字の前に)、あまりにも曖昧に( "@"文字の後に)、あまりにも鈍い(コメントを許可する)電子メールアドレスの構文を定義するRFC 5322の故意の違反です、空白文字、引用符で囲まれた文字列)を実際に使用することができます。

次のJavaScriptとPerl互換の正規表現は、上記の定義の実装です。

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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])?)*$/



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

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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])\]))$/



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

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




Wikipedia standard mail syntax :

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

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

// VALID MAILS

validMail('Abc@example.com') // Return true
validMail('Abc@example.com.') // Return true
validMail('Abc@10.42.0.1') // Return true
validMail('user@localserver') // Return true
validMail('Abc.123@example.com') // Return true
validMail('user+mailbox/department=shipping@example.com') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}~@example.com') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"Abc@def"@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('user@[IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

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

Show this test : https://regex101.com/r/LHJ9gU/1




best regex ever which confirm 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])+




Use this code inside your validator function:

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;
}

Else you can use jQuery . Inside rules define:

eMailId: {
    required: true,
    email: true
}



Links