1

Тема: kill lainocode: Валідація текстового поля

Прів. Є поле для введення email, і потрібно фільтрувати символи, що вводяться в нього.

The format of email addresses is local-part@domain where the local-part may be up to 64 сharacters long and the domain name may have a maximum of 128 characters. The local-part of the email address may use any of these ASCII characters: Latin Letters; Digits 0 to 9;
Special Characters like !#$%&'*+-/=?^_`{|}~@.

Тобто, поле може містити лише латинські літери, і їх потрібно переводити в верхній регістр, якщо вони в нижньому.
Також мона вводити оті спеціальні символи і циферки. При цьому ми можемо ввести лише одного равлика, і частина емейлу до равлика може містити максимально 64 символи, а після равлика - 128 символів.

Озьдо мій лайнокід

private char MyValidate(string input, int charIndex, char charToValidate)
{
    if ((charToValidate >= 'a' && charToValidate <= 'z') ||
        (charToValidate >= 'A' && charToValidate <= 'Z') ||
        charToValidate=='@' ||
        (charToValidate >= '0' && charToValidate <= '9') ||
        "!#$%&'*+-/=?^_`{|}~@.".Contains(charToValidate.ToString()))
    {
        if ((charToValidate == '@' && input.Contains("@")) ||
            (!input.Contains("@") && charIndex>=63) ||
            (input.Contains("@") && charIndex >= 192))
                return '\0';
    }
    else return '\0';

    return char.ToUpper(charToValidate);
}

input - весь рядок з символами
charIndex - індекс символу
charToValidate - тільки що введений символ

Наскільки він поганий за 100-бальною шкалою? І що з ним не так?

2

Re: kill lainocode: Валідація текстового поля

А регулярку зробити нє? Якщо нє, то

Char.IsLetter(charToValidate) || Char.IsDigit(charToValidate)

одразу три рядки покриває (ну, хіба ще треба переконатися, що не вищий юнікодний символ).

Подякували: FakiNyan, leofun012

3

Re: kill lainocode: Валідація текстового поля

ну я думав про регулярку, але подумав, що простими отакими штуками буде краще

4

Re: kill lainocode: Валідація текстового поля

отако переробив

private char MyValidate(string input, int charIndex, char charToValidate)
{
    Debug.Log(charToValidate + " " + (int)+charToValidate +" charindex: "+charIndex);
    if (char.IsLetterOrDigit(charToValidate) &&
        !(charToValidate >= 'а' && charToValidate <='я') &&
        !(charToValidate >= 'А' && charToValidate <= 'Я') ||
        charToValidate =='@' ||
        "!#$%&'*+-/=?^_`{|}~@.".Contains(charToValidate.ToString()))
    {
        Debug.Log("yep");
        if ((charToValidate == '@' && input.Contains("@")) ||
            (!input.Contains("@") && charIndex>=63) ||
            (input.Contains("@") && charIndex >= 192))
                return '\0';
    }
    else return '\0';

    return char.ToUpper(charToValidate);
}

5

Re: kill lainocode: Валідація текстового поля

чуйте, а як регекс може допомогти перевірити мені то все, якщо перевірка необхідна в процесі введення даних, тобто це не так, що у нас є готовий рядок, і от ми його перевіряємо, а ми вводимо буковку, і відразу потрібно перевірити, чи мона цю буковку вставляти сюди?

6 Востаннє редагувалося VTrim (21.05.2016 14:23:26)

Re: kill lainocode: Валідація текстового поля

Перш за все вам треба запускати "подію" для вводу символів в форму, як от oninput в JS, щоб під час вводу, поточний сформований рядок перевірявся по правилу (не обов'язково regexp) і при порушенні,  символ видалявся.

Не знаю як це у тих ваших шарпах.

7 Востаннє редагувалося koala (21.05.2016 15:05:00)

Re: kill lainocode: Валідація текстового поля

Валідність символу залежить від його місця в рядку, тому немає сенсу перевіряти тільки один символ. Зрештою, якщо я натисну ctrl+V, то який саме символ ви будете перевіряти? А так - є старий рядок, є новий (утворений додаванням чи видаленням - ой, а ви ж не перевіряєте таку можливість - одного чи кількох символів). Якщо ви хочете, щоб вираз в полі завжди був валідним - то якщо новий рядок невалідний, відкидайте його, але це, як на мене, не зручно, треба просто підсвічувати невалідне поле.
А ще ви довжини не перевіряєте, як в умові.

Подякували: FakiNyan, leofun012

8 Востаннє редагувалося FakiNyan (21.05.2016 15:12:11)

Re: kill lainocode: Валідація текстового поля

перевіряю ж https://не-дійсний-домен/oZQ2X/6c869db627.png
а ото так, про ctrl+v я не подумав

9

Re: kill lainocode: Валідація текстового поля

Так, дійсно, перевіряєте, але криво - наприклад, "a@aaa...a"(150 символів) під визначення не потрапляє, а ваша функція його валідує.

Подякували: FakiNyan, leofun012

10

Re: kill lainocode: Валідація текстового поля

отакої, не помітив цьої фігні

11

Re: kill lainocode: Валідація текстового поля

Регулярка
[A-Za-z0-9!#$%&'*+-/=?\^_`{|}~@]{1,64}@[A-Za-z0-9!#$%&'*+-/=?\^_`{|}~@]{1,128}

До речі, в умові стоїть, що там може бути @ в імені - якось дивно...

Подякували: FakiNyan, leofun012

12

Re: kill lainocode: Валідація текстового поля

я б сам хтів написати ту регулярку, видаліть її, поки я не зкопіював
якщо ви про це

Special Characters like !#$%&'*+-/=?^_`{|}~@.

то це, походу, замовник шось прогледів

13 Востаннє редагувалося leofun01 (23.05.2016 00:52:12)

Re: kill lainocode: Валідація текстового поля

Ще було би добре врахувати, що замість домена може бути IP.
https://i.stack.imgur.com/jQTnt.png

Не думав, що описів і реалізацій так багато.
http://emailregex.com/
https://html.spec.whatwg.org/multipage/ … il-address
http://tools.ietf.org/html/rfc6530
https://www.w3.org/TR/html-markup/datat … ailaddress
http://www.regular-expressions.info/email.html
https://msdn.microsoft.com/en-us/librar … 10%29.aspx

14

Re: kill lainocode: Валідація текстового поля

та які айпі? де ви таке бачили?

15 Востаннє редагувалося koala (23.05.2016 07:02:53)

Re: kill lainocode: Валідація текстового поля

Якщо не в курсі, то ось вам побудований за RFC регекс-валідатор. Повний.
http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

А у вашій схемі випадають:
- локальні однорангові домени
- нові довгі tld

Подякували: leofun011

16

Re: kill lainocode: Валідація текстового поля

та це вже просто смішно