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

Это полностью ленивая, низкая накладная, однофункциональная реализация пакета, которая не делает никакого накопления. Основываясь на (и исправляет проблемы) в решении Ника Уэйли с помощью EricRoller.

Итерация происходит непосредственно из основного IEnumerable, поэтому элементы должны быть перечислены в строгом порядке и не доступны больше чем единожды. Если некоторые элементы не потребляются во внутреннем цикле, они отбрасываются (и попытка получить к ним доступ через сохраненный итератор будет бросать InvalidOperationException: Enumeration already finished.).

Вы можете протестировать полный образец в .NET Fiddle .

public static class BatchLinq
{
    public static IEnumerable> Batch(this IEnumerable source, int size)
    {
        if (size <= 0)
            throw new ArgumentOutOfRangeException("size", "Must be greater than zero.");
        using (var enumerator = source.GetEnumerator())
            while (enumerator.MoveNext())
            {
                int i = 0;
                // Batch is a local function closing over `i` and `enumerator` that
                // executes the inner batch enumeration
                IEnumerable Batch()
                {
                    do yield return enumerator.Current;
                    while (++i < size && enumerator.MoveNext());
                }

                yield return Batch();
                while (++i < size && enumerator.MoveNext()); // discard skipped items
            }
    }
}

3943
задан 13 revs, 10 users 33% 15 July 2019 в 20:27
поделиться

12 ответов

Используя регулярные выражения , вероятно, лучший способ. Вы видите, что набор тестов здесь (взятый от хром )

function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\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,}))$/;
    return re.test(String(email).toLowerCase());
}

Вот является примером регулярного выражения, которое принимает unicode:

var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

, Но имеют в виду, что не нужно полагаться только на проверку JavaScript. JavaScript может легко быть отключен. Это должно быть проверено на стороне сервера также.

Вот пример вышеупомянутого в действии:

function validateEmail(email) {
  var re = /^(([^<>()[\]\\.,;:\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,}))$/;
  return re.test(email);
}

function validate() {
  var $result = $("#result");
  var email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").on("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>
4484
ответ дан 22 revs, 20 users 39% 15 July 2019 в 20:27
поделиться
  • 1
    Оператор @treap удаляет , не встраивается , как замечено в неразрешенной callq инструкции. Как Вы получаете листинг кода? – user3125280 19 January 2014 в 13:10

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

^\S+@\S+$

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

335
ответ дан 4 revs, 4 users 62% 15 July 2019 в 20:27
поделиться

JavaScript может соответствовать регулярному выражению:

emailAddress.match( / some_regex /);

Вот регулярное выражение RFC22 для электронных писем:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
67
ответ дан Ben Scheirman 15 July 2019 в 20:27
поделиться

Это было украдено из http://codesnippets.joyent.com/posts/show/1917

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}
43
ответ дан 17 December 2019 в 16:00
поделиться

Трудно получить валидатор электронной почты на 100% правильно. Единственный реальный способ исправить это - отправить тестовое электронное письмо на аккаунт. Тем не менее, есть несколько основных проверок, которые могут помочь убедиться, что вы получаете что-то разумное.

Некоторые вещи, которые нужно улучшить:

Вместо нового RegExp , просто попробуйте написать regexp следующим образом:

if (reg.test(/@/))

Во-вторых, убедитесь, что точка стоит после знака @ , и убедитесь, что между @ s есть символы и периоды.

16
ответ дан 17 December 2019 в 16:00
поделиться

Есть кое-что, что вы должны понять, как только вы решите использовать регулярное выражение для проверки писем: Это вероятно, не очень хорошая идея . Как только вы с этим согласитесь, есть много реализаций, которые помогут вам на полпути, эта статья хорошо их подытоживает.

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

324
ответ дан 17 December 2019 в 16:00
поделиться

Для полноты картины у вас есть другое регулярное выражение, совместимое с RFC 2822

Официальный стандарт известен как RFC 2822 . Он описывает синтаксис, которому должны соответствовать действующие адреса электронной почты. Вы можете (, но не должны - читать на ) реализовать это с помощью этого регулярного выражения:

(?: [A-z0-9! # $% & '* + / =? ^ _ `{|} ~ -] + (?: \. [a-z0-9! # $% & '* + / =? ^ _` {|} ~ -] +) * | " (?: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ x5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f] ) * ") @ (?: (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \.) + [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? | \ [(? :( ?: 25 [0-5] | 2 [0-4] [0-9] | [ 01]? [0-9] [0-9]?) \.) {3} (?: 25 [0-5] | 2 [0-4] [0-9] | [01]? [0- 9] [0-9]? | [A-z0-9 -] * [a-z0-9]: (?: [\ X01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ x5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])

(... Мы получим более практичную реализацию RFC 2822, если опустим синтаксис, используя двойные кавычки и квадратные скобки. Он по-прежнему будет соответствовать 99,99% всех адресов электронной почты, которые используются сегодня.

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

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

[a-z0-9! # $% & '* + / =? ^ _ `{|} ~ -] + (?: \. [A-z0-9! # $% &' * + / =? ^ _ `{|} ~ -] +) * @ (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? \ .) + (?: [AZ] {2} | com | org | net | gov | mil | biz | info | mobi | name | aero | jobs | museum) \ b

Таким образом, даже при соблюдении официальных стандартов предстоит еще пойти на компромисс. Не копируйте слепо регулярные выражения из онлайн-библиотек или дискуссионных форумов. Всегда проверяйте их на своих данных и в своих приложениях.

Акцент мой

738
ответ дан 17 December 2019 в 16:00
поделиться

Вот очень хорошее обсуждение использования регулярных выражений для проверки адресов электронной почты; « Сравнение адресов электронной почты с проверкой регулярных выражений »

Вот текущее верхнее выражение, совместимое с JavaScript, для справки:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i
12
ответ дан 17 December 2019 в 16:00
поделиться

Я добавляю свой Regex - я решил для меня больше небольших проблем как символы с других языков или прописных букв

^[a-zA-Z0-9][a-zA-Z0-9-_\.]+@([a-zA-Z]|[a-zA-Z0-9]?[a-zA-Z0-9-]+[a-zA-Z0-9])\.[a-zA-Z0-9]{2,10}(?:\.[a-zA-Z]{2,10})?$
2
ответ дан 17 December 2019 в 16:00
поделиться

Используйте браузер/время выполнения, чтобы обработать парсинг входа путем предварительного ожидания протокола и передать его URL API, захвата любых ошибок и проверить получающееся username и hostname свойства результата. Это обработает в основном все преобразования и возможности ( punycode наборов символов, и т.д.). Это только устанавливает, что вход parsable, не, который допустим - который только возможен посредством проверки, если целевая машина получает сообщения для того псевдонима. Это обеспечивает завершение (imo разумный) предположение, хотя, и может быть расширен, чтобы быть более конкретным и реалистичным, если Вы удобны и поддерживающие его и также риск недопустимыми отклонениями. (Обратите внимание, что это не пытается обратиться к IPv4 или адресам IPv6, просто широкий диапазон стоящих с клиентом сценариев с помощью домена.)

function validEmail(email=''){
    var [110], url, isValid = false, emailPatternInput = /^[^@]{1,64}@[^@]{4,253}$/, emailPatternUrl = /^[^@]{1,64}@[a-z][a-z0-9\.-]{3,252}$/i;
    email = email.trim();
    try{
        url = new URL('http://'+email);
        [110] = `${url.username}@${url.hostname}`;
        isValid = emailPatternInput.test( email );
        if(!isValid) throw 'invalid email pattern on input:' + email;
        isValid = emailPatternUrl.test( [110] );
        if(!isValid) throw 'invalid email pattern on url:' + [110];
        console.log(`email looks legit "${email}" checking url-parts: "${[110] === email ? '-SAME-':[110]}"`);
    }catch(err){
        console.error(`probably not an email address: "${email}"`, err);
    };
    return isValid;
}

['user+this@はじめよう.みんな', 'stuff@things', 'user+that@host.com', 'Jean+François@anydomain.museum','هيا@יאללה', '试@例子.测试.مثال.آزمایشی', 'not@@really', 'no'].forEach(email=>console.log(validEmail(email), email));

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

Также см. документы URL MDN URL, окно. URL и Nodejs для URL API.

1
ответ дан 17 December 2019 в 16:00
поделиться

Можно попробовать RegExp

function isValidEmail( value ) {
	return /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,5}$/.test( value );
}

console.log( isValidEmail("mymail@mydomain.com") )
0
ответ дан 17 December 2019 в 16:00
поделиться

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

/^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,3}){1,2}$/;
-5
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: