К сожалению, все предложения, кроме B-Money, в большинстве случаев недействительны.
Вот много действительных писем, таких как:
- günter@web.de (немецкий umlaut)
- антон@россия.рф (русский, рф является допустимым доменом)
- китайский и многие другие языки (см., Например, международная электронная почта и связанные спецификации).
Из-за сложности, необходимой для правильной проверки, я предлагаю очень общее решение:
<input type="text" pattern="[^@\s]+@[^@\s]+\.[^@\s]+" title="Invalid email address" />
Он проверяет, содержит ли электронная почта хотя бы один символ (также число или любой другой, кроме другого) @"или пробел) перед" @ ", по крайней мере два символа (или что-то еще, кроме другого" @ "или пробела) после" @ "и одна точка между ними.Этот шаблон не принимает адреса, подобные lol @ company, иногда используемые во внутренних сетях.Но этот можно использовать, если требуется:
<input type="text" pattern="[^@\s]+@[^@\s]+" title="Invalid email address" />
Оба шаблона могут принимать и менее действительные электронные письма, например, электронные письма с вертикальной вкладкой.Но для меня это достаточно хорошо.Более строгие проверки, такие как попытка подключения к почтовому серверу или домену ping, должны произойти в любом случае на стороне сервера.
Кстати, я только что написал угловую директиву (еще не проверенную) для проверки электронной почты с 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 достаточно просто "@".Но он отклоняет два или более "@" и все пробелы.