Проверьте адрес электронной почты с помощью JavaScript и регулярных выражений

Некоторое время назад я поставил Проверка надежности пароля с использованием JavaScript и регулярных выражений. В той же заметке вы также можете проверить структуру адреса электронной почты, используя ту же методологию регулярных выражений (regex).

Если ваш элемент формы имеет id = "адрес электронной почты" и вы добавляете форму onSubmit = »вернуть checkEmail ();“, Это функция Javascript, которую можно использовать для возврата предупреждения, если адрес электронной почты имеет допустимую структуру или нет:

function checkEmail() {
var email = document.getElementById('emailaddress');
var filter = /^(([^<>()[\]\\.,;:\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,}))$/;
if (!filter.test(email.value)) {
alert('Please provide a valid email address');
email.focus;
return false;
}
}

Функция проверяет содержимое электронного письма на соответствие фильтру. Если сравнение не удается, появляется предупреждение и возвращается фокус обратно в поле адреса электронной почты!

41 комментариев

  1. 1

    Для форм с несколькими адресами электронной почты было бы хорошо сделать class = ”emailaddress”. Если у вас есть библиотека prototype.js (http://www.prototypejs.org) на странице можно сделать что-то вроде этого:

    var valid = true;
    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    $$ ('. адрес электронной почты'). each (function (email) {
    if (! filter.test (email.value)) {
    предупреждение (? Укажите действующий адрес электронной почты?);
    email.focus;
    действительный = ложный;
    }
    });
    возврат действителен;

  2. 5
  3. 7

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

    Пример регулярного выражения, которое выполняет достойную работу, а также объяснение того, какие случаи оно не охватывает, см. В этом:

    http://www.regular-expressions.info/email.html

    Мое личное предпочтение - охватить большинство простых случаев и выдать предупреждение обо всем остальном, а не отклонять его. Если Боб действительно хочет отправить bob@com.museum а не bob@museum.comПочему бы ему не позволить?

    • 8

      Привет рег,

      Вы можете протестировать Regex, используя Онлайн тестер регулярных выражений.

      Кроме того, определенно можно сделать гораздо больше, если вы хотите адрес электронной почты действительно в соответствии с RFC.

      Есть несколько причин не позволять кому-либо вводить неверный адрес электронной почты:
      1. Они будут злиться на вас, если ожидаемое электронное письмо не доходит - независимо от того, была ли это ваша вина, что адрес был введен неправильно.
      2. Если com.museum был действующим доменом и, скажем, Yahoo! управлял им - любой адрес электронной почты, который был возвращен, негативно повлияет на репутацию вашей компании в отношении доставки электронной почты. Это может привести к блокировке всей электронной почты вашей компании.
      3. Если ваш поставщик услуг электронной почты разрешил вам ввести bob@com.museum, вы также должны платить за каждое письмо, отправленное на этот адрес электронной почты, до тех пор, пока они не отменит подписку на этот адрес из-за отказов. Я бы держался подальше от любых ESP, которые допускают такой недействительный адрес электронной почты - они просто забирают ваши деньги!

      Спасибо, что зашли!
      Дуг

  4. 9
  5. 10

    Есть гораздо более простой способ написать выражение:
    var regex = /^[a-z0-9\._-]+@([a-z0-9_-]+\.)+[a-z]{2,6}$/i;
    - В последнем модификаторе / i нет необходимости указывать диапазон верхнего регистра.
    - Я не знаю ни одного TLD с числами в нем.
    Кстати, я разрешаю TLD до 6 символов; новые приходят регулярно, и никогда не знаешь (ну, в некоторых будущих могут даже быть числа, я знаю).

  6. 11

    Всем привет,

    Я пытаюсь использовать это в существующей форме в режиме реального времени, но это не похоже на проверку в реальном времени, как проверка надежности вашего пароля ...

    Или я просто невежественен, и это не работает для меня?

  7. 12

    Кстати, мне очень нравится то, что вы здесь делаете, ваши уроки очень просты, я обязательно добавлю это в закладки….

  8. 13

    Просто к вашему сведению; Я не пробовал решение Ade, но приведенный выше шаблон не проверяет адреса электронной почты с апострофами ... (например, Mike.O'Hare@Whatever.com). Апострофы действительны в соответствии с RFC 2821/2822 -> http://www.faqs.org/rfcs/rfc2822.html

    НТН,
    Санджай

  9. 16

    Было бы хорошо, если бы мы смогли найти решение, позволяющее избежать фальшивых адресов электронной почты в комментариях к WordPress.

  10. 17

    Небольшая поправка: в конце регулярного выражения есть дополнительный () +. Его следует читать:

    ^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$

    С первым будет приниматься TLD любой длины (что не является внутренне неправильным, как указывали другие, но если это было намерением, выражение можно было бы сократить).

  11. 18

    Не могли бы вы объяснить регулярное выражение этого кода и как он работает? Также о .test - является ли .test оператором по умолчанию в javascript для проверки того, что вы сделали в приведенном выше коде?

  12. 19

    Это сокращенный код для выражения электронной почты -

    функция validateEmail (id)
    {
    var emailPattern = /^[a-zA-Z0-9._-pting+@[a-zA-Z0-9.-pting+.[a-zA-Z ]{2,4}$/;
    вернуть emailPattern.test (id);

    }
    Дипак Рай
    Варанаси

  13. 20

    Это сокращенный код для выражения электронной почты -

    функция validateEmail (id)
    {
    var emailPattern = /^[a-zA-Z0-9._-pting+@[a-zA-Z0-9.-pting+.[a-zA-Z ]{2,4}$/;
    вернуть emailPattern.test (id);

    }
    Дипак Рай
    Варанаси

  14. 21
  15. 22
  16. 23

    Спасибо, но в этом регулярном выражении есть ошибка. Я не эксперт по регулярным выражениям, но попробовал электронную почту:

    тест @ тест

    и он прошел регулярное выражение ... Я заметил, что ему не хватает экранирования "." так и должно быть:

    /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/

  17. 24
  18. 27

    Ну, это всего лишь грубая проверка, но не на 100% точная, например, это было бы нормально с john_doe. @ gmail.com который на самом деле не является действительным адресом электронной почты (точка не может быть последним символом в локальной части электронной почты).
    Также он примет john…doe@gmail.com что также недопустимо, поскольку в последовательности не может быть более одной точки.

    Это лишь некоторые недостатки, которые я заметил с первого взгляда.
    Мое намерение состоит не в том, чтобы просто указать на это на случай, если кто-то планирует использовать это в качестве проверки безопасности - недостаточно безопасно.

    Для получения информации о действительных адресах электронной почты проверьте это: http://en.wikipedia.org/wiki/E-mail_address

  19. 28

    Дипак,

    На самом деле, я думаю, вам нужно применить escape для точки («.»). Итак, ваша функция должна быть:

    функция validateEmail (id)
    {
    var emailPattern = /^[a-zA-Z0-9._-pting+@[a-zA-Z0-9.-pting+.[a-zA-Z ]{2,4}$/;
    вернуть emailPattern.test (id);

    }

    В противном случае точка означала бы «любой символ». Я считаю, что таких специальных символов нужно избегать.

    С Уважением,

    Федерико

  20. 29

    function validateEmail (fld) {
    var error = ””;
    var tfld = trim (fld.value); // значение поля с обрезанным пробелом
    var emailFilter = /^[^@*+@[^@.pting+.[^@**ww$/;
    var незаконныйChars = / [(),;: \ ”[]] /;

    if (fld.value == «Введите свой адрес электронной почты») {

    error = «Введите свой адрес электронной почты.n»;
    } else if (! emailFilter.test (tfld)) {// проверяем письмо на наличие недопустимых символов

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    } else if (fld.value.match (незаконныеЧары)) {

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    }
    ошибка возврата;
    }

  21. 30

    function validateEmail (fld) {
    var error = ””;
    var tfld = trim (fld.value); // значение поля с обрезанным пробелом
    var emailFilter = /^[^@*+@[^@.pting+.[^@**ww$/;
    var незаконныйChars = / [(),;: \ ”[]] /;

    if (fld.value == «Введите свой адрес электронной почты») {

    error = «Введите свой адрес электронной почты.n»;
    } else if (! emailFilter.test (tfld)) {// проверяем письмо на наличие недопустимых символов

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    } else if (fld.value.match (незаконныеЧары)) {

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    }
    ошибка возврата;
    }

  22. 31

    function validateEmail (fld) {
    var error = ””;
    var tfld = trim (fld.value); // значение поля с обрезанным пробелом
    var emailFilter = /^[^@*+@[^@.pting+.[^@**ww$/;
    var незаконныйChars = / [(),;: \ ”[]] /;

    if (fld.value == «Введите свой адрес электронной почты») {

    error = «Введите свой адрес электронной почты.n»;
    } else if (! emailFilter.test (tfld)) {// проверяем письмо на наличие недопустимых символов

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    } else if (fld.value.match (незаконныеЧары)) {

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    }
    ошибка возврата;
    }

  23. 32

    function validateEmail (fld) {
    var error = ””;
    var tfld = trim (fld.value); // значение поля с обрезанным пробелом
    var emailFilter = /^[^@*+@[^@.pting+.[^@**ww$/;
    var незаконныйChars = / [(),;: \ ”[]] /;

    if (fld.value == «Введите свой адрес электронной почты») {

    error = «Введите свой адрес электронной почты.n»;
    } else if (! emailFilter.test (tfld)) {// проверяем письмо на наличие недопустимых символов

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    } else if (fld.value.match (незаконныеЧары)) {

    error = «Пожалуйста, введите действующий адрес электронной почты.n»;
    }
    ошибка возврата;
    }

  24. 33
  25. 34
  26. 35
  27. 36
  28. 37
  29. 38
  30. 39
  31. 40

Как вы думаете?

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются ваши данные комментариев.