Как правильно проверить ввел пользователь номер телефона или свою почту?
Есть поле регистрации, где пользователя просят вводить почту или номер телефона. Как правильно проверить что пользователь ввел, чтобы потом решить отправлять письмо или смс?
input_data = '...'
if '@' in input_data:
try:
send_email(input_data)
except SMTPException:
# Ответить ошибкой о неправильных данных
else:
normalized_phone = ''.join(c for c in input_data if c.isnumeric())
if len(normalized_phone) >= MIN_PHONENUMBER_LENGTH:
send_sms(normalized_phone)
else:
# Ответить ошибкой о неправильных данных
Сергей Горностаев, мне кажется это странным решением - пытаться отправить емеил, для проверки валидности. Уж лучше api, если нужна максимальная точность, в остальных случаях базовых регулярок хватает более чем.
Обратите внимание, что у человека вопрос стоит не в том, что-бы проверить емеил на валидность а в том, что-бы убедиться, что введен именно емеил.
Ivan Yakushenko, у автора в вопросе процедура регистрации, мой код её как раз и делает. Если пользователь вводит "abrakadabra@qwerty" и потом получает ошибку - это как раз нужное поведение. Можно конечно проверять email с помощью API или регулярки, но это лишние действия, при отправке письма эта проверка всё равно будет сделана.
Sabrjkee, почему не сработает? Нормализация уберёт из введённых данных все нецифровые символы и на выходе вы будете иметь именно номер телефона. Например +7 (123) 456-78-90 превратиться в 71234567890. Такой вид гарантирует отсутствие абракадабры, исключает личные пристрастия пользователей в форматировании номеров, в таком виде номер удобно хранить в базе, в таком виде номера способны принимать все SMS-шлюзы.
Сергей Горностаев, извиняюсь не правильно прочитал строку, получается если потом использовать анологичный филд для логина то такой же вариант должен подойти, просто будет другая последующая логика
Sabrjkee, вот если у вас добавиться логин, который может содержать цифры, мой способ станет неприменим, так как не сможет отличить имя пользователя с цифрами от номера телефона. Теоретически тут могут стать полезны регулярные выражения, но повысится сложность кода и появится риск возникновения некоторого процента неверных оценок или придётся требовать от пользователей соблюдение жёсткого формата ввода. Намного лучше в таких случаях разделить поля или даже формы для ввода различных данных.
import re
if re.match(r"^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$", email):
print(True)
elif re.match(r"^\+\d{2}\(\d{3}\)\d{3}-\d{2}-\d{2}$", phone):
print(True)
Роман Мирр, это самые базовые проверки на емеил и номер телефона. В случае с емеил группа символов, собачка, группа символов, точка.
К слову эта регулряка собрана из примеров официальной документации Python.
Среди действенных способов это базовая проверка символа @, как указал Сергей Горностаев и затем проверить с каким-либо Email Verification API , аналогично через API с номером телефона - отправка смс с кодом подтверждения.