Форум Pawn.Wiki - Воплоти мечту в реальность!: IsValidEmail - Проверка Email на валидность - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

IsValidEmail - Проверка Email на валидность Оценка: -----

#1
Пользователь офлайн   Saibot 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Много кто использует регулярное выражение для проверки Email адреса на валидность.
Например я, ни хотел бы подключать сторонний плагин ради того, чтобы проверить - правильно ли игрок написали Email.
Данная функция, проверят строку на латинские буквы, а также на символ @.
До символа @ - Вы сможете ввести любые числа, латинские буквы, а так-же пробел и точки.
После символа @ - Вы не сможете вводить другие символы, кроме двух точек.​

stock IsValidEmail(const string[])
{
    new find_@,
        dots_after_@,
        num_repeating_points;

    new i, c;

    while((c = string[i++]) != '\0')
    {
        switch©
        {
            case 'A'..'Z', 'a'..'z', '-', '_', '0'..'9':
            {
                num_repeating_points = 0;
                continue;
            }
            case '@':
            {
                if(i == 1) return 0;
                find_@ ++;
            }
            case '.':
            {
                if(!find_@)
                {
                    if(num_repeating_points) return 0;
                    num_repeating_points++;
                    continue;
                }
                if(++ dots_after_@ > 2) return 0;
            }
            default: return 0;
        }
    }
    if(find_@ != 1 || dots_after_@ == 0) return 0;
    return 1;
} 


Данная функция возвращает:
  • 0 - Если найдены запрещенные символы
  • 1 - Если запрещенные символы не найдены


Пример использования:
if(IsValidEmail(/*строка*/) == 1) print("Нет запрещенных символов");
else print("Найдены запрещенные символы");



Автор: Saibot
Оптимизировал: DeimoS

Сообщение отредактировал Saibot: 31 июля 2022 - 12:38

2

#2
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Во-первых, почта возможна и на кириллице через любой соответствующий домен (ру/рус).
Во-вторых, даже у того же яндекса можно в адресе почты хоть через каждый символ поставить точки/дефисы. То же самое и с GMail.

Дальше, если честно, лень расписывать. Лучше просто приложу пример RegEx выражения, которое проверяет почту согласно стандарту RFC-822
Скрытый текст [Показать]


Думаю, должно быть очевидно, что набор символов в почте может быть гораздо более разнообразным, нежели то, которое реализовал ты. К тому же, реализовать проверку твоих условий можно гораздо проще. Но, в любом случае, гораздо эффективнее будет просто отправлять на указанную почту рандомный код, который игрок должен будет ввести в следующий диалог. Это даст тебе 100% проверку валидности почты без каких-либо трудозатрат.

Сообщение отредактировал DeimoS: 23 августа 2020 - 15:07

1

#3
Пользователь офлайн   Saibot 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Цитата

К тому же, реализовать проверку твоих условий можно гораздо проще.

Если можешь предоставить более оптимизированный вариант, буду только рад.

Цитата

Во-вторых, даже у того же яндекса можно в адресе почты хоть через каждый символ поставить точки/дефисы.

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

Сообщение отредактировал Saibot: 23 августа 2020 - 16:20

0

#4
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSaibot (23 августа 2020 - 15:35) писал:

Если можешь предоставить более оптимизированный вариант, буду только рад.


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

А если тебя интересует то, как можно твой код оптимизировать, то, как минимум, можно напрочь убрать всё связанное с переменной "right_symbol", просто пропуская итерацию при нахождении разрешённых символов, и так же убрать всё связанное с "wrong_symbol", возвращая 0 при нахождении запрещённых символов. Так же и проверки на количество точек не нужны, ибо, как уже было сказано, их количество может быть любым.

Вот такой функции хватит, чтоб отсечь самые очевидные кривые EMail-адреса
stock IsValidEmail(const string[])
{
    new find_@;
    new dots_after_@;
    new num_repeating_points;

    new i;
    new c;

    while((c = string[i++]) != '\0')
    {
        switch(c)
        {
            case 'A'..'Z', 'a'..'z', '-', '_', '0'..'9':
            {
                num_repeating_points = 0;
                continue;
            }
            case '@':
            {
                if(find_@ || i == 1)
                    return 0;

                find_@ = 1;
            }
            case '.':
            {
                if(!find_@)
                {
                    if(num_repeating_points)
                        return 0;

                    num_repeating_points++;
                    continue;
                }

                if(dots_after_@)
                    return 0;

                dots_after_@ = 1;
            }
            default:
                return 0;
        }
    }

    if(!find_@)
        return 0;

    return 1;
}

А уже дальше почту нужно проверять отсылкой рандомного кода.


UPD: И что у тебя за смесь чисел и смиволов в case? Почему все символы нельзя было написать через одинарные апострофы?

Сообщение отредактировал DeimoS: 13 сентября 2020 - 08:36

1

#5
Пользователь офлайн   Saibot 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
@DeimoS - Спасибо!!! Исправил, но пришлось не много переделать, так как код правильно не работал!

Сообщение отредактировал Saibot: 23 августа 2020 - 18:30

0

#6
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Что у тебя там не работало?
И у тебя название функции не совпадает с её функционалом. Если истина у тебя возвращается в случае, если EMail неправильный - функция должна называться IsInvalidEmail

UPD: А ещё в таких случаях, если начинаешь использовать чужой код, принято упоминать автора того кода, который используешь. Не говоря уже о том, что культурные люди обычно спрашивают разрешение :)

Сообщение отредактировал DeimoS: 23 августа 2020 - 18:48

0

#7
Пользователь офлайн   Saibot 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
@DeimoS, нет, все работает, я просто не правильно сравнение поставил.
Упомянул тебя.
0

#8
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Ничего не хочу сказать, но сейчас автором кода из шапки темы являюсь я :) Если бы я его только оптимизировал, то там бы большая часть кода была написана тобой, а я лишь внёс правки. Тут же я с нуля написал, фактически.
Впрочем, пусть это останется на твоей совести) Мне так-то особого дела до этого нет. Я лишь советовал бы так же в теме написать, что это не является каким-то 100% решением и что текущее условие может ряд реальных почтовых сервисов забраковать. Ну и что помимо использования этой функции нужно обязательно отправлять на почту сгенерированный код, который потом игрок будет вводить в другой диалог для подтверждения почты. Ну а если этого не делать, то тогда непонятно зачем заставлять игрока вводить свою почту.

Сообщение отредактировал DeimoS: 23 августа 2020 - 19:59

0

#9
Пользователь офлайн   Saibot 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
@DeimoS, кто же мог знать, что ты его оптимизируешь до неузнаваемости :)
Я уже 3 года pawn не занимался, мне что бы вспомнить хоть, что-то и написать эту систему, ушло два дня.
Можно сказать начинал с нуля, даже все функции и операторы пришлось гуглить, а то забыл все. :)

Цитата

Ну и что помимо использования этой функции нужно обязательно отправлять на почту сгенерированный код

Сделаю это в ближайшее время!!!

Сообщение отредактировал Saibot: 23 августа 2020 - 20:55

1

#10
Пользователь офлайн   X_mens 

  • Местный
  • Вставить ник
  • Раскрыть информацию
Я сначало подумал что ты будешь проверять существует ли это емаил на сервере гугл яндекс... . Надо было назвать IsValidEmailInStr типо того.

Сообщение отредактировал X_mens: 23 августа 2020 - 20:47

0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика