Comments 63
А зачем вообще проверять валидность email'а на клиенте? Даже отправка формы с полной перезагрузкой страницы была бы все равно быстрее, чем выкачивание 2.5 мб адресов.
На клиенте можно тупо первичную валидацию регекспом сделать, на соответствие формату.
А вот остальное — да, жесть.
PS:
А в идеале, конечно же, фоновая отправка содержимого поля формы на сервер для валидации на событие потери фокуса у этого поля ввода.
А вот остальное — да, жесть.
PS:
А в идеале, конечно же, фоновая отправка содержимого поля формы на сервер для валидации на событие потери фокуса у этого поля ввода.
Нельзя проверять регекспом email адреса. Уже обсуждалось 1 мильён раз.
Максимум что можно делать на клиенте — это проверять наличие одной собачки, потому что все случаи вы никогда не покроете.
Максимум что можно делать на клиенте — это проверять наличие одной собачки, потому что все случаи вы никогда не покроете.
Я имел ввиду простейшую проверку на клиенте, вида "(.+)@(.+)\.(.+)".
А если учесть, что возможны домены типа «yandex», то вы отсеиваете мыло «help@yandex» %)
Ну откиньте же последнюю группу с точкой, и будет щастье :)
Суть, как уже писали ниже, минимальная первичная валидация на клиенте — символы-собака-символы, только для того, чтобы сразу сказать пользователю, что он или опечатался или не заполнил поле.
Суть, как уже писали ниже, минимальная первичная валидация на клиенте — символы-собака-символы, только для того, чтобы сразу сказать пользователю, что он или опечатался или не заполнил поле.
Да уж, проверять регуляркой на наличие символов и собаки — надо умудриться)
var mail = 'ava@kadava.ka';
var split_mail = mail.split('@');
if(split_mail.length == 3) {
console.log(true)
}
Оки, признаю, оверхед вышел :) Скорее, в силу привычки. Но смысл то не в этом, а в самой идее.
скорее 2, а не 3
Пропустит строки вида 'aaa@'.console.log(mail.indexOf('@') > 0)
Я таки дочитал.
Эти два кода выдают разный результат. Про последний вариант я ничего не говорил.split_mail.length == 3
<...> эта проверка легко заменяется на
console.log(mail.indexOf('@') > 0)
Да я же не про опечатку в константе говорю, а про идею.
Ещё раз.
Ещё раз.
var mail1 = 'ava@kadava.ka';
var mail2 = 'ava@';
var split_mail = mail1.split('@');
console.log(split_mail.length == /*3*/ 2) // true
split_mail = mail2.split('@');
console.log(split_mail.length == 2) // false
console.log(mail1.indexOf('@') > 0) // true
console.log(mail2.indexOf('@') > 0) // true
split_mail = mail2.split('@');
console.log(split_mail.length == 2) // false
Вы уверены?
Кстати да, выдает true. Это уже ошибка, а не опечатка :)
Это вы мне отвечали?
Я-то как раз обращался к AraneusAdoro с предложением проверить, получается ли false.
Я-то как раз обращался к AraneusAdoro с предложением проверить, получается ли false.
Уже нет. Не ожидал, что в сплите будет пустая строка, каюсь.
Ну тогда оба примера с ошибками, только разного плана.
Ну тогда оба примера с ошибками, только разного плана.
Я почему и поставил проверку на длину. До этого еще стоит бы тримировать строку.
Вообще говоря, в одном валидном e-mail может быть две собаки. RFC 2821 явно говорит, что всё, что до первой (незаквоченной) собаки — дело сервера, и не нам это валидировать. То есть всякий трэш вроде
tools.ietf.org/html/rfc3696#section-3 говорит об этом немного подробнее.
"A--Sf#zfr@s%r d@$\\sf+?*ser"@test.com
— вполне себе валидный адрес.tools.ietf.org/html/rfc3696#section-3 говорит об этом немного подробнее.
Т.е. вы реально считаете, что операцию, которая проводится на клиенте раз в кучу времени, стоит реализовывать так, чтобы у вашего последователя глаза выпали?
Оптимизация головного мозга, имхо.
Оптимизация головного мозга, имхо.
Есть валидные адреса, не соответствующие этой схеме. UUCP mail еще местами работает.
!somedomain!somehost!user
!somedomain!somehost!user
Ниразу такого не видел. Можно плз деталей, где и как это используется?
Это способ записи адреса для Unix to Unix Copy Protocol, который местами еще не отключили. Одно время его весьма активно использовали для почты. en.wikipedia.org/wiki/UUCP#Mail_routing
К слову, какой нибудь sendmail его до сих пор поддерживает.
К слову, какой нибудь sendmail его до сих пор поддерживает.
Можно ещё проверять наличие любых символов до и после собачки, а так да, толку от здоровенных регэкспов немного(причём не только на клиенте).
Опередили меня…
Опередили меня…
Об этом, собственно, и статья.
Как показывает практика, на фронтенде достаточно проверить в адресе наличие @, ну а сверять со списком — вообще бред, имхо.
И кстати, на сервере в большинстве случаев тоже. Если нужно проверить адрес просто на валидность, то нужно чтоб была одна собака и что-то вокруг неё.
Превед потенциальные уязвимости :)
Нужно, как минимум, проверять на соответствие RFC, сразу после приема формы сервером.
Нужно, как минимум, проверять на соответствие RFC, сразу после приема формы сервером.
Уязвимости типа арабских букв, вешающих Сафари? Ну дык это тоже валидный адрес (при наличии собаки в середине).
Не забываем про IDN и надвигающиеся домены первого уровня.
Или имелся в виду HTML? Его конечно надо тогось.
Не забываем про IDN и надвигающиеся домены первого уровня.
Или имелся в виду HTML? Его конечно надо тогось.
В моей практике были случаи, когда через contact us форму легко и свободно осуществляли спам-рассылки. Там тоже была валидация вида «есть собака — все ок», совершенно не учитывая, что туда можно запихать все что угодно, начиная от списка из двух-трех десятков адресов, и заканчивая JS-кодом и SQL-инъекциями.
Кстати, если на сервере php (> 5.2), то проверка очень простая:
Почему-то многие про это забывают (или не знают) и по старинке лепят регекспы или встроенные функции их движка (который чаще всего регулярками и проверяет).
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
// ok, validated
}
Почему-то многие про это забывают (или не знают) и по старинке лепят регекспы или встроенные функции их движка (который чаще всего регулярками и проверяет).
Вы видели, что внутри этого FILTER_VALIDATE_EMAIL? Так вот там, по старинке, залеплен регексп: github.com/php/php-src/blob/master/ext/filter/logical_filters.c#L533
естественно там регексп. Речь о том, что это встроенная функция и будет работать быстрее + работать правильно, чем написанный на коленке регексп.
То есть вы в принципе не против регекспов? Тогда не совсем понятно, почему вы считаете, что по старинке лепить регекспы — хуже, чем использовать filter_var().
Правильность: этот регексп был туда притащен из встроенной функции движка Squiloople. Поэтому, не вдаваясь непосредственно в код самих регекспов, нельзя сказать, насколько он правильнее регекспа какого-то другого движка.
Скорость: чему там быть быстрее? И там и там будет вызов PCRE.
Правильность: этот регексп был туда притащен из встроенной функции движка Squiloople. Поэтому, не вдаваясь непосредственно в код самих регекспов, нельзя сказать, насколько он правильнее регекспа какого-то другого движка.
Скорость: чему там быть быстрее? И там и там будет вызов PCRE.
Речь о том, что люди начинают изобретать велосипед, часто даже регекспы неправильные пишут, когда уже все есть и готовое.
Последнюю строчку прочитал как:
ПРЕДУПРЕЖДЕНИЕ: Злоупотребление наркотиками плохо влияет на ваш исходный мозг
Все не так плохо! Там хотя бы break; стоит в цикле ;)
>>… сам сидит на мете…
Метаобфускация кода
Метаобфускация кода
Фиг с валидацией — мало ли дырявых релеев. Какая адресная книга по универу удобная!
Тот автор случайно нигде не делал валидацию кредитных карт?
Тот автор случайно нигде не делал валидацию кредитных карт?
Естественно надо на стороне сервера и естественно асинхронный запрос…
Адовому программеру было лень писать AJAX и он запилил «в лоб». (а чё, работает же!))
Адовому программеру было лень писать AJAX и он запилил «в лоб». (а чё, работает же!))
С приходом html5 на клиенте проверяю с помощью:
<input type="email" />
Есть один «простой» regex: www.ex-parrot.com/pdw/Mail-RFC822-Address.html
Уже с учетом этого комментария, этот RegExp не корректно отрабатывает.
Дико бесит когда сервис не принимает е-мейл в зоне .info; Кстати если не путаю — на госуслуги меня с таким адресом не пустили, пришлось другой давать.
Шел 2013 год, а программисты все спорили как проверять валидность email.
Sign up to leave a comment.
Как не надо делать проверку валидности email