JavaScript で電子メール アドレスを検証するにはどうすればよいですか?
-
09-06-2019 - |
質問
JavaScript で電子メール アドレスを検証するにはどうすればよいですか?
解決
使用する 正規表現 おそらく最良の方法です。たくさんのテストを見ることができます ここ (から抜粋 クロム)
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(String(email).toLowerCase());
}
Unicode を受け入れる正規表現の例を次に示します。
var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
ただし、JavaScript の検証だけに依存すべきではないことに注意してください。JavaScript は簡単に無効にすることができます。これはサーバー側でも検証する必要があります。
上記の実際の例を次に示します。
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);
}
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").on("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>
他のヒント
完全を期すために、 ここに別の 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
. 。あなた 新しいトップレベル ドメインが追加されると更新する必要があります.
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b
したがって、公式の基準に従っている場合でも、トレードオフが依然として存在します。 オンライン ライブラリやディスカッション フォーラムから正規表現をやみくもにコピーしないでください。常に独自のデータとアプリケーションを使用してテストしてください。
私のものを強調してください
次の形式で本当に単純な検証を必要とする人のために、ジェイモンの回答を少し変更しました。
任意の文字列@任意の文字列.任意の文字列
正規表現:
/\S+@\S+\.\S+/
JavaScript 関数の例:
function validateEmail(email)
{
var re = /\S+@\S+\.\S+/;
return re.test(email);
}
うわー、ここにはたくさんの複雑さがあります。最も明白な構文エラーを検出するだけであれば、次のようにします。
^\S+@\S+$
通常、ユーザーが犯す最も明白なエラーを検出し、フォームがほぼ正しいことを保証します。これが JavaScript 検証のすべてです。
電子メールを検証するために正規表現を使用することに決めた時点で、次のことを理解する必要があります。 それはおそらく良い考えではありません. 。一度それを受け入れてしまえば、途中まで到達できる実装はたくさんあります。 この記事はそれらをうまくまとめています。
しかし要するに、ユーザーが入力した内容が実際に電子メールであることを絶対的かつ確実に確信する唯一の方法は、実際に電子メールを送信して何が起こるかを確認することです。それ以外はすべて単なる推測です。
HTML5 自体には電子メール検証があります。ブラウザが HTML5 をサポートしている場合は、次のコードを使用できます。
<form><input type="email" placeholder="me@example.com" required>
<input type="submit">
</form>
jsフィドル リンク
から HTML5仕様:
あ 有効な電子メールアドレス に一致する文字列です
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])?)*$/
これが最良の解決策であることがわかりました。
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
次の形式が許可されます。
1. prettyandsimple@example.com 2. very.common@example.com 3. disposable.style.email.with+symbol@example.com 4. other.email-with-dash@example.com 9. #!$%&'*+-/=?^_`{}|~@example.org 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 で技術的に許可されているスペースをブロックしますが、そのようなスペースは非常にまれであるため、喜んでこれを実行します。
最新のブラウザでは、純粋な JavaScript を使用して @Sushil の回答に基づいて構築できます。 ドム:
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/. 。機能検出と必要最低限の検証を組み合わせる ゼニガメの答え, 、正規表現の大虐殺から解放され、古いブラウザでも動作しません。
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)>)$
これは正しい 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);
}
すべての電子メール アドレスには「アット」が含まれます (つまり、@) 記号。必要な条件をテストします。
email.indexOf("@") > 0
これ以上複雑なことは気にしないでください。たとえ電子メールが RFC 構文的に有効であるかどうかを完全に判断できたとしても、それがその電子メールを提供した人のものであるかどうかはわかりません。それが本当に重要なことなのです。
それをテストするには、検証メッセージを送信します。
RFC に準拠した電子メール アドレスの正しい検証は、一行の正規表現では実現できません。PHP で私が見つけた最良の解決策を記載した記事は次のとおりです。 有効な電子メール アドレスとは何ですか?. 。明らかに Java に移植されています。 この関数は JavaScript に移植して使用するには複雑すぎると思います。 JavaScript/node.js ポート: 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 文字が必要です。たとえば、a@b.com
.(str.length - lastDotPos) > 2
:最後のドットの後には、2 文字のドメインを形成するのに十分な文字が必要です。括弧が必要かどうかわかりません。
これは~から盗まれたものです 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;}
この問題を解決するのが本当に楽しみです。そこで、上記の電子メール検証の正規表現を変更しました
オリジナル
/^(([^<>()\[\]\\.,;:\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,})$/
例を渡すには ウィキペディアのメールアドレス.
そして、結果は次のとおりです。 ここ.
これを行う:
[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.正規表現.info/email.html
入力文字列を検証して電子メールかどうかを確認するために正規表現を使用しないでください。複雑すぎるため、すべてのケースをカバーすることはできません。
ここではケースの 90% しかカバーできないため、次のように書きます。
function isPossiblyValidEmail(txt) {
return txt.length > 5 && txt.indexOf('@')>0;
}
洗練させることができます。たとえば、「aaa@」は有効です。しかし、全体的には要点がわかります。そして、夢中にならないでください...シンプルな 90% の解決策は、機能しない 100% の解決策よりも優れています。
世界はよりシンプルなコードを必要としています...
入力したメールアドレスが有効かどうかをHTMLを使用してチェックするだけです。
<input type="email"/>
検証用の関数を作成する必要はありません。
こうやって ノードバリデータ そうなります:
/^(?:[\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])\]))$/
電子メール検証ツールを 100% 正確に取得することは困難です。正しく認識する唯一の実際の方法は、アカウントにテストメールを送信することです。そうは言っても、妥当な結果を得ているかどうかを確認するのに役立つ基本的なチェックがいくつかあります。
改善すべき点:
新品の代わりに RegExp
, を書いてみてください。 regexp
次のように出力します。
if (reg.test(/@/))
次に、ピリオドが後に来ることを確認します。 @
署名し、間に文字があることを確認してください。 @
とピリオド。
バリデーター関数内でこのコードを使用します。
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
}
正規表現アップデート 2018!これを試して
let val = 'email@domain.com';
if(/^[a-z0-9][a-z0-9-_\.]+@([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');
}
typscriptのバージョンが完成しました
//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([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
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])+
TLD の存在を確認しないソリューションは不完全です。
この質問に対するほとんどすべての回答は、電子メール アドレスを検証するために Regex を使用することを提案しています。Regex は初歩的な検証にのみ適していると思います。電子メール アドレスの検証のチェックは、実際には 2 つの別個の問題であるようです。
1- 電子メール形式の検証: 電子メールが RFC 5322 の電子メールの形式とパターンに準拠しているかどうか、および TLD が実際に存在するかどうかを確認します。すべての有効な TLD のリストが見つかります。 ここ.
たとえば、アドレスですが、 example@example.ccc
正規表現を渡しますが、有効な電子メールではありません。 ccc
は IANA によるトップレベル ドメインではありません。
2- 電子メールが実際に存在することを確認します。 これを行うために、 唯一の選択肢 は ユーザーにメールを送信するため.
どうやら、それは次のとおりです。
/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i
から引用 http://fightingforalostcause.net/misc/2006/compare-email-regex.php '10年10月1日。
しかし、もちろん、それは国際化を無視しています。
対照的に、 ゼニガメ, 、これは複雑な解決策ですが、電子メールを適切に検証するという素晴らしい仕事をします。
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'); }
ここでは、電子メール アドレスを検証するための正規表現の使用についての非常に優れた説明を示します。」電子メール アドレスの比較正規表現の検証"
参考のために、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
私の知識 正規表現 あまり良くありません。そのため、最初に単純な正規表現を使用して一般的な構文をチェックし、その後、他の関数を使用してより具体的なオプションをチェックします。これは最良の技術的解決策ではないかもしれませんが、この方法の方がはるかに柔軟で高速です。
私が遭遇した最も一般的なエラーは、スペース (特に先頭と末尾) と、場合によっては二重ドットです。
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
<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>
Microsoft が提供する正規表現 ASP.NET MVC は
/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/
欠陥がある場合に備えてここに投稿しますが、私のニーズには常に完璧でした。
ウィキペディアの標準メール構文:
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
このテストを表示します: https://regex101.com/r/LHJ9gU/1