Не корректная валидация email

В коде, который делает валидацию емеила (js/tygh/core.js:112) допущена не так чтобы ошибка, а неточность, из-за которой возможен ввод адреса вроде name@domain или вообще адреса русскими буквами.
Предлагаю заменить это

            email: function(email)
            {
                return /\S+@\S+.\S+/i.test(email) ? true : false;
            },

на это

            email: function(email)
            {
                return /(?:[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])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-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])+)\])/i.test(email) ? true : false;
            },

Этот формат соответствует RFC 5322

2 лайка

Спасибо за предложение. Передали его разработчикам

Русские домены уже давно есть.
После ряда проблем, мы решиоли максимально упростить валидацию.
Если клиент хочет ввести не валидный адрес он все равно это сделает.

cs-cart версии 4.9.1
появляются аккаунты с вот такими емейлами:
xxx@gmail,com
xxx@mail .ru
x xx@mail.ru
xxx@gmail.com;

как с этим бороться?

Включите капчу для регистрации

присоединяюсь к вопросу, что сложного задать паттерн, хотя бы подскажите как это сделать

создал тему-просьбу, неужели никто не может подсказать

Ответил вам в теме

Яндекс разрешает дефис в адресе

на 4.11.3 работает?

Это заработает не зависимо от версии, пока не переделают механизм валидации
Вот тесты
https://regexr.com/51m1h

1 лайк

а получается часть до @ проверяется?

image

Зафейлится только с пробелом
https://regexr.com/51qu3

я вот такое регулярное выражение использовал

/^[0-9a-z-.]+@[0-9a-z-]{2,}.[a-z]{2,}$/i

вроде лишних символов не пропускает

Я бы не изобретал велосипед на вашем месте. Кривой регуляркой валидации обязательного поля можно очень мощно “помочь” своему бизнесу.

Лишних не пропускает.
Да и не лишних тоже не пропускает

По быстрому, что пришло в голову
ne_work@yandex.ru
brrr@linux.org.ru


Это всё моё личное мнение, а вы делайте как считаете правильно

действительно, не пропускает

почему-то с двойным отрицанием ломается магазин, без него все работает

function(e) { return !!/(?:[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?|[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])).){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-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])+)])/i.test(e) }

Яндекс допускает дефис в имени ящика

Рабочая валидация
до @ И после
{email:function(e){return /^([A-Za-z0-9_-.])+@([A-Za-z0-9_-.])+.([A-Za-z]{2,4})$/.test(e)}

Есть веселый момент, вот у клиента человек подписался на товар указав “dir21`2@mail.ru д/морозовой” в итоге когда 1с отрабатывает обновление остатков, и товар на который он подписан попыталось уведомить (причем опять же странная система cs-cart, что это происходит в реальном времени, а не отложено, 1с обмен и так медленный, так еще рассылка в это время делается) его о поступлении товара, 1с обмен падает выдается ошибка.
Клиенты возрастные и по этому их логику не понять, проверка хотя бы минимальная должна быть, чтобы не крошилась вот к примеру подписка на товары.

2 лайка

Много вариантов перепробовал, ненавижу регулярки)
Сработал только доработанный вариант:

{email:function(e){return /^([a-zA-Z0-9_.+-])+@([a-zA-Z0-9-])+\.([a-zA-Z0-9-.])+$/.test(e)}

Вдруг кому пригодится…

Тестовый пример
.@-…