проверка подлинности электронной почты javascript - PullRequest
4 голосов
/ 06 мая 2010

эта функция JavaScript (checkValidity) правильно?

function checkTextBox(textBox)
{
   if (!checkValidity(textBox.getValue()))
       displayError("Error title", "Error message", textBox);
       textBox.focus();
}

function checkValidity(e) 
{
    var email;
    email = "/^[^@]+@[^@]+.[a-z]{2,}$/i";

    if (!e.match(email)){
            return false;
    else
            return true;
    }
}

РЕДАКТИРОВАТЬ: Все ответы приветствуются! Спасибо!

Ответы [ 8 ]

7 голосов
/ 06 мая 2010

Адрес электронной почты определен в RFC 5322, § 3.4 . Соответствующий нетерминал - addr-spec. Определение оказывается несколько кратким из-за сложностей спецификаций предметной области и поддержки старых, устаревших форм. Однако для большинства форм вы можете выполнить чрезмерное приближение с помощью:

^[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+@[-0-9A-Za-z!#$%&'*+/=?^_`{|}~.]+

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

Это регулярное выражение не будет соответствовать некоторым необычным формам, таким как "noodle soup @ 9"@[what the.example.com] - это допустимый адрес электронной почты!

3 голосов
/ 06 мая 2010
function isValidEmail($email)
{
    return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email);
};

if(isValidEmail("name@yahoo.com"))
{
  echo "valid";
}
else
{
   echo "aaa";
};
2 голосов
/ 06 мая 2010

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

function checkEmailValidity(e) {
  return e.match("some validating regex");
}

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

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

Рассмотрим этот код:

function validateEmail(email) {
    if (typeof email != "string") return false;
    email = email.split("@");
    email[1] = email[1].split(".");
    if (
        email.length !== 2 ||
        email[1].length < 2 ||
        !email[1].hasValues(String)
    ) return false;
    return true;
}

// Checks whether each key in an array has a value, and (optionally) if they match a given contructor (object type).
// I.e.: myArray.hasValues(String) // checks whether all elements in myArray has a value, a nonempty string.
Array.prototype.hasValues = function(assumedConstructor) {
    for (var i = 0; i < this.length; i++) {
        if (!this[i]) return false;
        if (assumedConstructor && this[i].constructor != assumedConstructor) return false;
    }
    return true;
};

Работает так:

  1. Сначала проверяется, содержит ли строка один @ и только один
  2. Проверяет, что деталь после @ имеет хотя бы один .
  3. Проверяет, есть ли символы между каждым из возможных ..

По-прежнему будет легко подделать поддельный адрес электронной почты, но таким образом мы гарантируем, что он по крайней мере каким-то образом будет правильно отформатирован. Единственное, что я могу придумать, это внутренние комментарии @, которые должны быть абсолютно законными в соответствии с RFC, но этот код будет воспринимать это как ошибку.
Обычные пользователи интернета, у которых нормальные адреса электронной почты, не подведут. Так что, насколько это действительно важно, решать вам;)

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

1 голос
/ 06 мая 2010

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

В разделе 3.4.1 RFC 5322 подробно рассказывается об огромном разнообразии допустимых символов, и вы увидите, что создание регулярного регулярного выражения будет почти невозможно.

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

1 голос
/ 06 мая 2010

Вот регулярное выражение, соответствующее RFC, также исключая устаревшие формы. Я разбил его на компоненты, чтобы его было легко читать:

IDENT = [a-z0-9](?:[a-z0-9-]*[a-z0-9])?
TEXT = [a-z0-9!#$%&'*+/=?^_`{|}~-]+

EMAIL = TEXT(?:\.TEXT)*@IDENT(?:\.IDENT)+

(Примечание: регистр не учитывается).

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

1 голос
/ 06 мая 2010

Попробуйте: я уверен, что он позаботится обо всех видах проверки электронной почты.

function checkEmail(email)
{   
    if(/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(email)) {
      return true;
    } else {
      return false;
    }
}

HTH

1 голос
/ 06 мая 2010

Нет. Предполагается, что адрес электронной почты может содержать только один @. Я бы предложил прочитать эту статью .

Вы, вероятно, также имели в виду \. вместо ..

0 голосов
/ 29 мая 2013

Выполняя пару поисков, я наткнулся на это. Его основано на RFC 2822

http://snipplr.com/view/20981/

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