Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Пробелы в валидации поля (https://javascript.ru/forum/misc/83707-probely-v-validacii-polya.html)

Andrew2108 18.02.2022 19:23

Пробелы в валидации поля
 
Добрейшего времени суток помогите пожалуйста с проблемой
есть у меня такая регулярка, но она пропускает проблемы вначале "логина" и в конце ,как этого избежать ?
/^[A-Za-z0-9]{6,16}$/
также пробовал с ^[\s]
В центре он не пропускает, а по краям пропускает пробелы
function regLog(login)
{
	return /^[A-Za-z0-9]{6,16}$/.test(login);
}
loginValue = login.value.trim();

else if (!regLog(loginValue))
	{
	setErrorFor(login, 'Введите корректно логин');
	}

так я это всё использую, помогите пожалуйста как убрать эти пробелы

Andrew2108 18.02.2022 19:51

Можете объяснить почему это так работает ?
я не понимаю...

Andrew2108 18.02.2022 20:13

Разобрался почему так
у меня следующий вопрос связанный с регулярками
мне нужен ввод маила, чтобы нельзя было ввести два знака @@ по типу mail@@mail.ru && mail@m@ail.ru

Nexus 18.02.2022 20:41

http://emailregex.com/
var regex = /^(([^<>()\[\]\\.,;:\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,}))$/;
alert([
    regex.test('asd@asd'), 
    regex.test('asd@asd.ad'), 
    regex.test('asd@asd@adsda.asd')
]);// false, true, false

рони 18.02.2022 20:48

Andrew2108,
/^[^@]+@[^@]+$/

Andrew2108 18.02.2022 22:42

Спасибо Nexus, работает, за исключением пробелов в начале и в конце самого маила, не подскажешь как эти пробелы убрать ?

Белый шум 19.02.2022 07:16

Andrew2108,
.trim() ??

Andrew2108 20.02.2022 16:30

Если трим , то это уже не валидация, а мне нужно, чтобы ошибку давало по типу :"введите правильно маил".если есть пробелы

voraa 20.02.2022 16:42

А зачем тогда вы trim используете?
Покажите свой нынешний код.

Andrew2108 20.02.2022 18:37

Я проверил, трим убирает пробелы при записи, но мне нужна именно валидация, а не пустое отсечение пробелов, поэтому нужна регулярка, которую я сам пока не в состоянии написать
const emailValue = email.value; // значение из поля
// регулярка 
function regEmail(email)
{
	return /^(([^<>()\[\]\\.,;:\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,}))$/.test(email);
}

// вызов регулярки и условие
else if (!regEmail(emailValue))
	{
	setErrorFor(email, 'Введите email корректно');
	}

voraa 20.02.2022 21:11

Ну вот же написали вам регулярку. Наверно она покрывает 95% возможных email адресов и возможных ошибок. Не думаю, что можно (или можно не безумно сложным способом) написать регулярку на 100% покрывающую все допустимые email и отлавливающие все ошибки

micscr 21.02.2022 09:08

Эти валидации емейла, можете из готовых либ поискать

Вот, например в yii, так делают (часть кода)

email: function (value, messages, options) {
            if (options.skipOnEmpty && pub.isEmpty(value)) {
                return;
            }

            var valid = true,
                regexp = /^((?:"?([^"]*)"?\s)?)(?:\s+)?(?:(<?)((.+)@([^>]+))(>?))$/,
                matches = regexp.exec(value);

            if (matches === null) {
                valid = false;
            } else {
                var localPart = matches[5],
                    domain = matches[6];

                if (options.enableIDN) {
                    localPart = punycode.toASCII(localPart);
                    domain = punycode.toASCII(domain);

                    value = matches[1] + matches[3] + localPart + '@' + domain + matches[7];
                }

                if (localPart.length > 64) {
                    valid = false;
                } else if ((localPart + '@' + domain).length > 254) {
                    valid = false;
                } else {
                    valid = options.pattern.test(value) || (options.allowName && options.fullPattern.test(value));
                }
            }

            if (!valid) {
                pub.addMessage(messages, options.message, value);
            }
        },

voraa 21.02.2022 09:50

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

micscr 21.02.2022 15:42

Да, там все сложнее оказывается, весь этот код выше для чего то своего, а паттерн вот тут тестируется - valid = options.pattern

, паттерн там такой:
https://www.yiiframework.com/doc/api/2.0/yii-validators-emailvalidator#$pattern-detail

voraa 21.02.2022 16:04

Все равно всего он не проверяет. Либо не допускает корректные адреса, либо пропускает некорректные
Я уж не говорю про интернационализацию. (по современным протоколам почтовых серверов в адресе могут быть и кириллические буквы, и греческие, и арабские, и иероглифы).
https://ru.abcdef.wiki/wiki/Email_address
Поэтому слишком муторно (а возможно ли?) писать регулярку покрывающую 100% верных адресов, и отбрасывающую 100% неверных.
Да и нужно ли. Ведь пользователь может ошибиться в самом адресе.
Скажем напишет не voraa@gmail.com, а woraa@gmeil.com (что чаще и происходит)
И толку от этих всех проверок

Andrew2108 21.02.2022 20:17

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

Nexus 21.02.2022 20:41

Andrew2108,
var regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\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,}))$/;

console.log([
    regex.test('asd@aasd.sd'),// true
    regex.test(' [email]asd@aasd.sd[/email] '),// false
    regex.test('asd@aasd.sd '),// false
    regex.test(' [email]asd@aasd.sd[/email]'),// false
    regex.test('asd@@aasd.sd'),// false
    regex.test('asd@aa@sd.sd'),// false
    regex.test('@asd@sd.sd'),// false
    regex.test('asd@sd.sd@'),// false
    regex.test(' @asd@sd.sd'),// false
    regex.test(' @asd@sd.sd '),// false
    regex.test(' [email]asd@sd.sd[/email]@'),// false
    regex.test(' [email]asd@sd.sd[/email]@ ')// false
]);

voraa 21.02.2022 21:05

А что насчет

kot.matroskin(familiya takaya)@mail.ru
kot.matroskin@[IPv6:2001:db8::1]
"kot\"matroskin\""@mail.ru

и
kot.matroskin@-mail.ru

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

Andrew2108 21.02.2022 21:50

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

Andrew2108 21.02.2022 21:56

" zzzz@mail.ru" - пропускает
или "zzzz@mail.ru " - также пропускает

Nexus 21.02.2022 22:39

Цитата:

Сообщение от Andrew2108
" zzzz@mail.ru" - пропускает
или "zzzz@mail.ru " - также пропускает

Или я дурак, или лыжи не едут.
Пример кода приведите, где у вас регулярка пробелы пропускает.

Белый шум 22.02.2022 04:37

Andrew2108,
Код:

С пробелом (false):
alert( /^(([^<>()\[\]\\.,;:\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,}))$/.test(' zzzz@mail.ru') );


Без пробела (true):
alert( /^(([^<>()\[\]\\.,;:\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,}))$/.test('zzzz@mail.ru') );

ЗЫ: пришлось обернуть в CODE чтоб форум не оборачивал имейлы в тег email. Кто-нибудь знает другой способ запретить ему это делать?

Andrew2108 22.02.2022 17:19

Спасибо, работает!
НО не работало, когда поле было с тип email, не знаю почему, он добавлял и обрезал сам все пробелы.
Поменял тип на текст в поле и сё прекрасно работает.
Всем спасибо


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