1つのメール入力、1つのチェックボックス入力、1つの送信入力を含むhtml5フォームを作成しようとしています。メールの入力にパターン属性を使用しようとしていますが、この属性に何を配置するのかわかりません。 JavaScriptパターンの生成に一致する必要がある正規表現を使用することになっていることは知っていますが、これを行う方法はわかりません。
この属性を取得しようとしているのは、電子メールに1つの@と少なくとも1つ以上のドットが含まれていることを確認し、可能であれば@の後のアドレスが実際のアドレスかどうかを確認することです。この属性を使用してこれを実行できない場合は、JavaScriptの使用を検討しますが、1つの@と1つ以上のドットを確認するために、パターン属性を必ず使用します。
パターン属性は以下をチェックする必要があります:
これに代わるものはJavaScriptを使用することですが、他のすべての条件ではJavaScriptを使用したくない
これは二重の問題です(World Wide Webの世界の多くと同様)。
ブラウザがhtml5をサポートしているかどうかを評価する必要があります(Modernizrを使用してそれを行います)。この場合、通常のフォームがある場合はブラウザが代わりに作業を行いますが、ajax/jsonが必要な場合(多くの場合)、とにかく手動検証を実行する必要があります。
..だから、私の提案は、送信する前にいつでも正規表現を使用して評価することです。使用する式は次のとおりです。
var email = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
これは http://www.regular-expressions.info/ から取得されます。これは理解して習得するのが難しい世界なので、このページを注意深く読むことをお勧めします。
上記のAlwin Keslersの回答を使用して、HTML5の電子メール入力にこの正確な問題がありました。ユーザーが最後に.somethingを持たなければならないように、HTML5の電子メール入力に正規表現を追加しました。
<input type="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" />
HTML5では、新しい「メール」タイプを使用できます。 http://www.w3.org/TR/html-markup/input.email.html
例えば:
<input type="email" id="email" />
ブラウザがHTML5を実装している場合、ユーザーがフィールドに有効なメールアドレスを入力したことを確認します。ブラウザがHTML5を実装していない場合、「テキスト」タイプのように扱われることに注意してください。
<input type="text" id="email" />
残念ながら、B-Money以外のすべての提案はほとんどの場合無効です。
有効なメールは次のとおりです。
検証を正しく行うには複雑さがあるため、非常に汎用的なソリューションを提案します。
<input type="text" pattern="[^@\s]+@[^@\s]+\.[^@\s]+" title="Invalid email address" />
メールに「@」の前に少なくとも1文字(数字または別の「@」または空白を除く任意の文字)、「@」の後の少なくとも2文字(または別の「@」または空白を除く任意の文字)およびの間に。このパターンは、内部ネットワークで使用されることがあるlol @ companyのようなアドレスを受け入れません。ただし、必要に応じてこれを使用できます。
<input type="text" pattern="[^@\s]+@[^@\s]+" title="Invalid email address" />
どちらのパターンも、垂直タブ付きのメールなど、有効性の低いメールも受け入れます。しかし、私にとってはそれで十分です。とにかく、サーバー側でメールサーバーやpingドメインに接続しようとするような強力なチェックを行う必要があります。
ところで、私はangularディレクティブを作成しました(まだ十分にテストされていません)novalidate
を使用し、DRY原則をサポートするための上記のパターンに基づいていない電子メール検証用:
.directive('isEmail', ['$compile', '$q', 't', function($compile, $q, t) {
var EMAIL_PATTERN = '^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$';
var EMAIL_REGEXP = new RegExp(EMAIL_PATTERN, 'i');
return {
require: 'ngModel',
link: function(scope, elem, attrs, ngModel){
function validate(value) {
var valid = angular.isUndefined(value)
|| value.length === 0
|| EMAIL_REGEXP.test(value);
ngModel.$setValidity('email', valid);
return valid ? value : undefined;
}
ngModel.$formatters.unshift(validate);
ngModel.$parsers.unshift(validate);
elem.attr('pattern', EMAIL_PATTERN);
elem.attr('title', 'Invalid email address');
}
};
}])
使用法:
<input type="text" is-email />
B-Moneyのパターンは「@」で十分です。ただし、2つ以上の「@」とすべてのスペースは拒否されます。
これは私が使用しているアプローチであり、必要に応じて変更できます。
^[\w]{1,}[\w.+-]{0,}@[\w-]{2,}([.][a-zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})$
説明:
電子メールアドレスが常にWordで始まることを確認する必要があります。
^ [\ w]
Wordは、任意の文字、数字、またはアンダースコアです。 [a-zA-Z0-9_]パターンを使用できますが、同じ結果が得られ、長くなります。
次に、このようなキャラクターが少なくとも1つ存在することを確認します。
^ [\ w]{1、}
次に、名前にワード、数字、または特殊文字を許可します。これにより、電子メールがドットで始まらないことを確認できますが、最初の位置以外にドットを含めることができます。
^ [\ w] {1、}[\ w。+-]
そしてもちろん、電子メールアドレスには1文字の後に@を付けることができるため、このような文字を使用する必要はありません。
^ [\ w] {1、} [\ w。+-]{0、}
次に、必須の@文字が必要ですが、メール全体に1つしか入力できません。
^ [\ w] {1、} [\ w。+-] {0、}@
@文字のすぐ後ろに、ドメイン名が必要です。ここで、必要な文字数と最小文字数を定義できます。ハイフン[\ w-]を含むすべてのWord文字を探して、そのうちの少なくとも2つが必要です{2、}。 t.coのようなドメインを許可する場合、この範囲から1文字を許可する必要があります{1 、}:
^ [\ w] {1、} [\ w。+-] {0、} @[\ w-] {2、}
次に、2つのケースに対処する必要があります。ドメイン名の後にドメイン拡張子が続くか、サブドメイン名の後にドメイン名の後に拡張子が続くかのいずれかです。たとえば、abc.com対abc.co.ukこれを機能させるには、(a | b)トークンを使用する必要があります。ここで、aは最初のケース、bは2番目のケース、|は論理ORを表します。最初のケースでは、ドメイン拡張子のみを扱いますが、ケースに関係なく常に存在するため、両方のケースに安全に追加できます。
^ [\ w] {1、} [\ w。+-] {0、} @ [\ w-] {2、}([。] [a-zA-Z] {2、} | [。] [a-zA-Z] {2、})
このパターンは、1つのドット文字に続けて文字が必要で、数字は不要であり、どちらの場合も少なくとも2つが必要であることを示しています。
2番目の場合、ドメイン拡張子の前にドメイン名を追加し、元のドメイン名をサブドメインにします。
^ [\ w] {1、} [\ w。+-] {0、} @ [\ w-] {2、}([。] [a-zA-Z] {2、} |[。] [\ w-] {2、}[。] [a-zA-Z] {2、})
ドメイン名は、ハイフンを含むWord文字で構成できますが、ここでも少なくとも2文字が必要です。
最後に、パターン全体の終わりをマークする必要があります。
^ [\ w] {1、} [\ w。+-] {0、} @ [\ w-] {2、}([。] [a-zA-Z] {2、} | [。] [\w-] {2、} [。] [a-zA-Z] {2、})$
ここに移動して、電子メールがパターンに一致するかどうかをテストします。 https://regex101.com/r/374XLJ/1
<input name="email" type="email" pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$" class="form-control" placeholder="Email*" id="email" required="">
これは、大文字を受け入れる上記のソリューションの修正版です。
[email protected] # Minimum three characters
[email protected] # Accepts Caps as well.
[email protected] # Accepts . before @
<input type="email" pattern="[A-Za-z0-9._%+-]{3,}@[a-zA-Z]{3,}([.]{1}[a-zA-Z]{2,}|[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,})" />
W3org仕様の上に構築されたもう1つのソリューション。
元の正規表現は w3org から取得されます。
この正規表現の最後の「*Lazy量指定子」は、「+1つ以上の数量詞」。
このようなパターンは仕様に完全に準拠していますが、1つの例外があります。「foo @ com 」
<input
type="email"
pattern="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+"
title="[email protected]"
placeholder="[email protected]"
required>
おそらくこのようなものが必要です。属性に注意してください:
<input type="email" value="" name="EMAIL" id="EMAIL" placeholder="[email protected]" autofocus required pattern="[^ @]*@[^ @]*" />
<input type="email" name="email" id="email" value="" placeholder="Email" required />
2018年の回答を更新
ここに行く http://emailregex.com/
Javascript:
/^(([^<>()\[\]\\.,;:\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,}))$/
電子メール標準に関するホワイトペーパーを書きたくない場合は、次の例を使用して、既知のCSS属性(text-transform:lowercase)を導入して問題を解決します。
<input type="email" name="email" id="email" pattern="[a-zA-Z0-9._%+-]+@[a-z0-9.-]+\.[a-zA-Z]{2,4}" style="text-transform: lowercase" placeholder="enter email here ..." title="please enter a valid email" />
^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$
Chrome Html電子メール入力検証と同じ結果が得られる次の正規表現をテストしました。
[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*
このウェブサイトでテストできます: regex101