regex 入力 チェック - JavaScriptでメールアドレスを検証する方法は?





15 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

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

重心

正規 表現 rails

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




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

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




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])?)*$/



現代のブラウザでは、純粋な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() : /\S+@\S+\.\S+/.test(value);
}

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




これは正しいRFC822バージョンです。

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}



すべてのメールアドレスには「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




入力文字列を検証して電子メールかどうかを確認する正規表現は使用しないでください。 それは複雑すぎるし、すべてのケースをカバーするものではありません。

今度はケースの90%しかカバーできないので、次のような記述をしてください:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

あなたはそれを洗練することができます。 たとえば、 'aaa @'は有効です。 しかし、全体的にあなたは要点を得る。 そして、迷惑にならないでください...単純な90%ソリューションは、機能しない100%ソリューションよりも優れています。

世界はより単純なコードを必要とします...




これは、 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])\]))$/



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

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

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

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

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




squirtleとは対照的に、ここでは複雑な解決策がありますが、電子メールを正しく検証することは非常にうまくいきます。

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

そう使います:

if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }



これまでに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])+




正規表現を使用して電子メールアドレスを検証する方法については、非常に良い議論です。「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



<form name="validation" onSubmit="return checkbae()">
    Please input a valid email address:<br />

    <input type="text" size=18 name="emailcheck">
    <input type="submit" value="Submit">
</form>

<script language="JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>



ASP.NET MVC内でMicrosoftが提供する正規表現は次のとおりです。

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

それは欠陥がある場合に備えて私がここに投稿するものですが、いつも私のニーズには完璧です。




Related