Я спрашиваю, есть ли лучшие способы определить, какая строка была введена, номер телефона или адрес электронной почты, вот мой уже рабочий код
public function InviteFriend($invitation)
{
// Initialize Connection
$conn = $this->conn;
// Check what type of Invitation it is
if (preg_match_all('~\b\d[- /\d]*\d\b~', $invitation, $res) > 0) {
$type = 'phone';
} else if (preg_match_all('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i', $invitation, $res) > 0) {
$type = 'email';
}
echo $type;
}
Но меня беспокоит то, что если пользователь набирает телефон и адрес электронной почты в одной строке, какой из операторов if будет выбран, а какой будет проигнорирован? и есть ли способ определить, какой тип строки является правильным, или есть более эффективный способ? Спасибо
Да, это должно быть @revo
Пожалуйста, взгляните на эти сайты: Список TLD: iana.org/domains/root/db; действительные / недействительные адреса: en.wikipedia.org/wiki/Email_address#Examples; регулярное выражение для адреса электронной почты RFC822: ex-parrot.com/~pdw/Mail-RFC822-Address.html






Во всех разновидностях регулярных выражений почти доступны две привязки, которые вы использовали во втором регулярном выражении для проверки адреса электронной почты, которые показаны как ^ и $ и обозначают начало и конец входной строки соответственно.
Вы также должны использовать их для первой проверки. Проверка вашего номера телефона не имеет хорошей проверки, поскольку она проверяет произвольную последовательность строк, такую как 1------- --------5, которая не похожа на номер телефона, и многое другое, поскольку она не соответствует всей строке (отсутствуют оба упомянутых якоря). Поэтому я использовал \d{10}, чтобы указать 10-значный номер телефона, который вы, возможно, захотите изменить в соответствии со своими требованиями, на этот раз более точно.
Вам тоже не нужна такая проверка электронной почты. Что-нибудь попроще - лучше:
public function InviteFriend($invitation)
{
if (preg_match('~^\d{10}$~', $invitation)) {
$type = 'phone';
} else if (preg_match('~^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$~i', $invitation)) {
$type = 'email';
}
echo $type ?? 'Error';
}
Вы можете уменьшить регулярное выражение проверки электронной почты, используя filter_var. filter_var ($ приглашение, FILTER_VALIDATE_EMAIL)
Да, это выбор, и я предпочитаю его. Ссылка в моем ответе указывает на тот же RFC, используемый этим фильтром.
@Smartpal Я тоже использовал это для проверки, но определить, что такое строка, является реальным сценарием здесь и делать это правильно
@PreciousTom Вы должны заставить пользователя ввести телефон или адрес электронной почты, пользователь вводит и то, и другое, или неверные данные отправляют неверный ответ.
Вы не узнали, как по этому ответу определить, что такое строка? @PreciousTom
Ответ @PreciousTom revo почти правильный, добавьте еще с $ type = 'Invalid', затем проверьте тип, если он недействителен, отправьте неверный ответ пользователю.
За несколько минут до вашего комментария я изменил ответ. @Smartpal
Это должен быть номер телефона или только адрес электронной почты?