Как проверить адрес электронной почты в JavaScript? - PullRequest
3795 голосов
/ 05 сентября 2008

Как проверить адрес электронной почты в JavaScript?

Ответы [ 82 ]

3 голосов
/ 12 августа 2015

лучший: D (дружественный RFC и без ошибок "слишком сложный"):

function    isMail(mail)
{
    pattuser = /^([A-Z0-9_%+\-!#$&'*\/=?^`{|}~]+\.?)*[A-Z0-9_%+\-!#$&'*\/=?^`{|}~]+$/i;
    pattdomain = /^([A-Z0-9-]+\.?)*[A-Z0-9-]+(\.[A-Z]{2,9})+$/i;

    tab = mail.split("@");
    if (tab.length != 2)
        return false;
    return (pattuser.test(tab[0]) && pattdomain.test(tab[1]));
}
3 голосов
/ 10 сентября 2013

Если вы используете Closure, вы можете использовать встроенный goog.format.EmailAddress тип:

http://docs.closure -library.googlecode.com / мерзавец / class_goog_format_EmailAddress.html

Например:

goog.format.EmailAddress.isValidAddrSpec("blah@blah.com")

Обратите внимание, что читая источник (ссылка выше), вы можете видеть состояние комментариев, что IDN не поддерживаются и что он предназначен только для покрытия большинства адресов:

// This is a fairly naive implementation, but it covers 99% of use cases.
// For more details, see http://en.wikipedia.org/wiki/Email_address#Syntax
// TODO(mariakhomenko): we should also be handling i18n domain names as per
// http://en.wikipedia.org/wiki/Internationalized_domain_name
3 голосов
/ 28 января 2014
<code><pre>
**The personal_info part contains the following ASCII characters.
1.Uppercase (A-Z) and lowercase (a-z) English letters.
2.Digits (0-9).
3.Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
4.Character . ( period, dot or fullstop) provided that it is not the first or last character and it will not come one after the other.**
* Пример действительного адреса электронной почты *
yoursite@ourearth.com
my.ownsite@ourearth.org
mysite@you.me.net
xxxx@gmail.com
xxxxxx@yahoo.com
xxxx.ourearth.com [@ is not present] 
xxxx@.com.my [ tld (Top Level domain) can not start with dot "." ]
@you.me.net [ No character before @ ]
xxxx123@gmail.b [ ".b" is not a valid tld ]
xxxx@.org.org [ tld can not start with dot "." ]
.xxxx@mysite.org [ an email should not be start with "." ]
xxxxx()*@gmail.com [ here the regular expression only allows character, digit, underscore and dash ]
xxxx..1234@yahoo.com [double dots are not allowed
** JavaScript почтовый код ** функция ValidateEmail (inputText) { var mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\wabilities2,3 rout)+$/; если (inputText.value.match (mailformat)) { document.form1.text1.focus (); вернуть истину; } еще { alert («Вы ввели неверный адрес электронной почты!»); document.form1.text1.focus (); вернуть ложь; } }
3 голосов
/ 23 июля 2016

Если вы используете ng-pattern и материал, это делает работу.

vm.validateEmail = '([a-zA-Z0-9_.]{1,})((@[a-zA-Z]{2,})[\\\.]([a-zA-Z]{2}|[a-zA-Z]{3}))';
2 голосов
/ 28 мая 2018

На этот вопрос ответить сложнее, чем кажется на первый взгляд.

В мире было множество людей, которые искали «регулярное выражение, чтобы управлять ими всеми», но правда в том, что существуют тона поставщиков электронной почты.

В чем проблема? Ну, «a_z%@gmail.com не может существовать, но может существовать такой же адрес через другого провайдера» a__z@provider.com.

Почему? По данным РФЦ: https://en.wikipedia.org/wiki/Email_address#RFC_specification.

Я возьму выдержку, чтобы облегчить лекцию:

The local-part of the email address may use any of these ASCII characters:

- uppercase and lowercase Latin letters A to Z and a to z;
- digits 0 to 9;
- special characters !#$%&'*+-/=?^_`{|}~;
- dot ., provided that it is not the first or last character unless quoted, and provided also that it does not appear consecutively unless quoted (e.g. John..Doe@example.com is not allowed but "John..Doe"@example.com is allowed);[6]
Note that some mail servers wildcard local parts, typically the characters following a plus and less often the characters following a minus, so fred+bah@domain and fred+foo@domain might end up in the same inbox as fred+@domain or even as fred@domain. This can be useful for tagging emails for sorting, see below, and for spam control. Braces { and } are also used in that fashion, although less often.
- space and "(),:;<>@[\] characters are allowed with restrictions (they are only allowed inside a quoted string, as described in the paragraph below, and in addition, a backslash or double-quote must be preceded by a backslash);
- comments are allowed with parentheses at either end of the local-part; e.g. john.smith(comment)@example.com and (comment)john.smith@example.com are both equivalent to john.smith@example.com.

Итак, я могу владеть таким адресом электронной почты:

A__z/J0hn.sm{it!}h_comment@example.com.co

Если вы попробуете этот адрес, держу пари, он потерпит неудачу во всех или в большей части регулярных выражений, размещенных по всей сети. Но помните, что этот адрес следует правилам RFC, поэтому он действителен.

Вообразите мое разочарование в связи с тем, что я нигде не смог зарегистрироваться, проверенный этими регулярными выражениями !!

Единственный, кто действительно может подтвердить адрес электронной почты, является поставщиком адреса электронной почты.

Как с этим бороться, так?

Не имеет значения, добавляет ли пользователь недействительный адрес электронной почты почти во всех случаях. Вы можете положиться на HTML 5 input type = "email", который работает около в RFC, малый шанс на провал. HTML5 input type = "email" info: https://www.w3.org/TR/2012/WD-html-markup-20121011/input.email.html

Например, это действительный адрес электронной почты RFC:

"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com

Но проверка html5 скажет вам, что текст перед @ не должен содержать, например, символы "или"), что на самом деле неверно.

В любом случае, вы должны сделать это, приняв адрес электронной почты и отправив сообщение на этот адрес электронной почты с кодом / ссылкой, которую пользователь должен посетить, чтобы подтвердить действительность.

Хорошей практикой при этом является ввод "введите свой адрес электронной почты еще раз", чтобы избежать ошибок при вводе пользователем. Если вам этого недостаточно, добавьте модальное окно предварительной отправки с заголовком «Это ваш текущий адрес электронной почты?», А затем сообщение, введенное пользователем внутри тега h2, вы знаете, чтобы четко показать, какой адрес -почту, которую они ввели, затем кнопку "да, отправить".

1 голос
/ 15 декабря 2014

Если вы используете AngularJS, просто добавьте type="email" к элементу ввода:

https://docs.angularjs.org/api/ng/input/input%5Bemail%5D

Если элемент ввода отсутствует, его можно создать динамически:

var isEmail = $compile('<input ng-model="m" type="email">')($rootScope.$new()).
    controller('ngModel').$validators["email"];

if (isEmail('email@gmail.com')) {
  console.log('valid');
} 
1 голос
/ 08 ноября 2016

Тот, кто использует решение @pvl и хочет, чтобы он прошел ESLint Prefer-template , тогда вот версия, где я использовал литералы шаблона вместо конкатенации строк.

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

    let reValidEmail = new RegExp(sValidEmail);

    return reValidEmail.test(email);
}
1 голос
/ 18 февраля 2015

Я знаю, это не регулярное выражение, но в любом случае ...

Это пример с узлом и пакетом npm email-существование это окончательная проверка, существует ли электронная почта и имеет ли она правильную форму:)

Это будет пинговать электронное письмо, если оно отвечает, если оно не получило ответа, оно вернет false или иначе true.

function doesEmailExist(email) {
    var emailExistence = require('email-existence');
    return emailExistence.check(email,function (err,status) {
            if (status) {
                return status;
            }
            else {
                throw new Error('Email does not exist');
            }
        });
}
1 голос
/ 02 марта 2015

Следующие проверки регулярных выражений:

  • До @
  • (-) и (.) Не должны быть вместе после @
  • Никаких специальных символов после @ 2 символов не должно быть до @
  • Длина электронной почты должна быть не более 128 символов

    function validateEmail(email) {
        var chrbeforAt = email.substr(0, email.indexOf('@'));
        if (!($.trim(email).length > 127)) {
            if (chrbeforAt.length >= 2) {
                var re = /^(([^<>()[\]{}'^?\\.,!|//#%*-+=&;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
                return re.test(email);
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    
1 голос
/ 03 ноября 2015

Это регулярное выражение предотвращает дублирование доменных имен, таких как abc@abc.com.com.com.com, только два раза разрешает домен, как abc@abc.co.in. Это также не позволяет делать запись с номера, такого как 123abc@abc.com

regexp: /^([a-zA-Z])+([a-zA-Z0-9_.+-])+\@(([a-zA-Z])+\.+?(com|co|in|org|net|edu|info|gov|vekomy))\.?(com|co|in|org|net|edu|info|gov)?$/,  

Все лучшее !!!!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...