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




メール アドレス rfc チェック (24)

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

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


現代のブラウザでは、純粋な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からのベアボーンの検証とを組み合わせることで、あなたは正規表現の大虐殺から解放され、古いブラウザではボークが実行されません。


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

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
}

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

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

email.indexOf("@") > 0

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

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


おそらく、 正規表現を使用するのが最良の方法です。 あなたはhereでのテストの束を見ることができherechromiumから取った)

function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\[email protected]"]+(\.[^<>()\[\]\\.,;:\[email protected]"]+)*)|(".+"))@((\[[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(String(email).toLowerCase());
}

ユニコードを受け入れる正規表現の例を次に示します。

var re = /^(([^<>()\[\]\.,;:\[email protected]\"]+(\.[^<>()\[\]\.,;:\[email protected]\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\[email protected]\"]+\.)+[^<>()[\]\.,;:\[email protected]\"]{2,})$/i;

しかし、JavaScriptの検証にのみ依存するべきではないことに留意してください。 JavaScriptは簡単に無効にすることができます。 これはサーバー側でも検証する必要があります。

上記の動作例を次に示します。

function validateEmail(email) {
  var re = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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);
}

function validate() {
  var $result = $("#result");
  var email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").bind("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>



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

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

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

これは正しい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);
}

完全性のために、 別の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

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

重心


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

<input type="email"/>

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


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


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

改善すべき点:

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

if (reg.test(/@/))

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


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

\[email protected]\S+

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


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

Wikipedia Email Addressの例を渡す。

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


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

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


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

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

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

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

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


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文字のドメインを形成するには、最後のドットの後に十分な文字がなければなりません。 大括弧が必要かどうかはわかりません。


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

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

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

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

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


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

<form><input type="email" placeholder="[email protected]">
    <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.!#$%&'*+/=?^_`{|}~-][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])?)*$/

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

[email protected]

正規表現:

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

JavaScript関数の例:

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

正規表現の更新2018! これを試して

let val = '[email protected]';
if(/^[a-z0-9][a-z0-9-_\.][email protected]([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

タイプスクリプトの完全版

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.][email protected]([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

詳細情報https://git.io/vhEfc


私はこれが最善の解決策であることを発見しました:

/^[^\[email protected]][email protected][^\[email protected]]+\.[^\[email protected]]+$/

以下のフォーマットが可能です:

1.  [email protected]
2.  [email protected]
3.  [email protected]e.com
4.  [email protected]
9.  #!$%&'*+-/=?^_`{}|[email protected]
6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

それは明らかに汎用性があり、すべての重要な国際文字を許可しますが、基本的なanything.anything.anything形式を強制します。 RFCによって技術的に許可されているスペースはブロックされますが、これは非常にまれで、私はこれをやってうれしいです。







email-validation