Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Форма проверки Email исключение? (https://javascript.ru/forum/dom-window/74297-forma-proverki-email-isklyuchenie.html)

AlexPebody 29.06.2018 06:15

Форма проверки Email исключение?
 
Доброго времени.

Если может кто, подскажите пожалуйста, никак не могу въехать, есть форма проверки Email адреса, с подсветкой и выведением сообщений:

$(document).ready(function() {
$('#email').blur(function() {
if($(this).val() != '') {
var pattern = /^([a-z0-9_\.-])+@[a-z0-9-]+\.([a-z]{2,4}\.)?[a-z]{2,4}$/i;
if(pattern.test($(this).val())){
$(this).css({'border' : '2px solid #81fc87'});
$('#valid').text('');
} else {
$(this).css({'border' : '2px solid #ff0000'});
$('#valid').text(''); alert('Вы ввели неверный \"email\", такого адреса нет!\r\nПожалуйста проверьте и введите верный адрес.');
}} else {
$(this).css({'border' : '2px solid #ff0000'});
$('#valid').text(''); alert('Вы не ввели адрес \"email\", не хотите отправлять?\r\nТогда проигнорируйте это сообщение и нажмите ОК.');


Нужно сделать исключение, чтобы при вводе в поле слов: save или русского: сохранить, не выполнялась проверка в паттерне, те чтобы скрипт пропускал это как нормально введенный Email. Как это сделать? В паттерне: var pattern = /^([a-z0-9_\.-])+@[a-z0-9-]+\.([a-z]{2,4}\.)?[a-z]{2,4}$/i; пытался подставить через || никак не вышло.

Заранее СПАСИБО! :thanks:

Aetae 29.06.2018 06:31

/^([a-z0-9_\.-])+@[a-z0-9-]+\.([a-z]{2,4}\.)?[a-z]{2,4}$|^save$|^сохранить$/i
:)

Белый шум 29.06.2018 08:23

Сейчас появилось много длинных доменов первого уровня (включая национальные, которые начинаются с xn--):
https://ru.wikipedia.org/wiki/%D0%A1...B2%D0%BD%D1%8F

так что "?[a-z]{2,4}$" в конце
надо заменить на "?[a-z0-9-]{2,}$"

А в начале:
"/^([a-z0-9_\.-])+@"

я бы добавил как минимум ещё символ плюса:
"/^([a-z0-9_\.\+-])+@"

-- http://savepearlharbor.com/?p=188548
Хотя, по спецификации там ещё много символов разрешается на самом деле...

AlexPebody 29.06.2018 08:45

Большое спасибо!

Сделал вот так: var pattern = /^([a-zа-я0-9_\.\+-])+@[a-zа-я0-9-]+\.([a-zа-я0-9-]{2,}\.)?[a-zа-я0-9-]{2,}$|^save$|^Save$|^SAVE$|^сохранить|^С охранить|^СОХРАНИТЬ$/i;

А как на PHP сделать то же самое? Переносил, пробовал добавить русские а-яё, пролазил пачку форумов, толку 0,
не пропускает вот такой емайл например:

mail@васяпупкин.рф

Как победить? Хотя на JS из выражения выше, рисует зеленым (проверка email) и все ок, а в php сейчас стоит вот так и ничего не работает: if (!preg_match('~^([a-zа-яё0-9_\-\.])+@([a-zа-яё0-9_\-\.])+\.([a-zа-яё0-9])+$~i', $_POST['code']))

AlexPebody 29.06.2018 09:40

Вот так заработало на PHP: preg_match('~^([a-zA-Zа-яА-Я0-9_\-\.])+@([a-zA-Zа-яА-Я0-9_\-\.])+\.([a-zA-Zа-яА-Я0-9])+$~ui

Есть что то добавить?

Aetae 29.06.2018 09:54

По первому - не надо дублировать в разных регистрах, у тебя стоит флаг i - а значит пройдёт и save и Save и sAvE.
По второму - если копируешь регулярки из js в php - достаточно обернуть в ': /x/i => '/x/i', не надо перепиливать.
По третьему - хрень всё это на самом деле, с современным развитием доменных имён нормально проверять на мыло так: ^[^@\s]+@[^@\s]+$ и всё. Ну или вот:).

AlexPebody 29.06.2018 09:58

Понял спс! 8-)

laimas 29.06.2018 10:01

Модификатор i для чего, если диапазоны a-zA-Zа-яА-Я?
Кроме этого диапазон a-z0-9 и подчеркивание, это слово - \w.
Не встречал, чтобы почтовые сервера разрешали имена ящиков отличных от латиницы.

Aetae 29.06.2018 12:27

laimas, стандарт не запрещает. А то что не встречали - так и не искали.)

laimas 29.06.2018 12:41

Цитата:

Сообщение от Aetae
стандарт не запрещает.

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


Часовой пояс GMT +3, время: 23:40.