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

Я спрашиваю, есть ли лучшие способы определить, какая строка была введена, номер телефона или адрес электронной почты, вот мой уже рабочий код

    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 22.04.2018 22:48

Да, это должно быть @revo

Precious Tom 22.04.2018 23:19

Пожалуйста, взгляните на эти сайты: Список TLD: iana.org/domains/root/db; действительные / недействительные адреса: en.wikipedia.org/wiki/Email_address#Examples; регулярное выражение для адреса электронной почты RFC822: ex-parrot.com/~pdw/Mail-RFC822-Address.html

Toto 23.04.2018 09:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во всех разновидностях регулярных выражений почти доступны две привязки, которые вы использовали во втором регулярном выражении для проверки адреса электронной почты, которые показаны как ^ и $ и обозначают начало и конец входной строки соответственно.

Вы также должны использовать их для первой проверки. Проверка вашего номера телефона не имеет хорошей проверки, поскольку она проверяет произвольную последовательность строк, такую ​​как 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)

Smartpal 22.04.2018 23:46

Да, это выбор, и я предпочитаю его. Ссылка в моем ответе указывает на тот же RFC, используемый этим фильтром.

revo 22.04.2018 23:52

@Smartpal Я тоже использовал это для проверки, но определить, что такое строка, является реальным сценарием здесь и делать это правильно

Precious Tom 23.04.2018 10:57

@PreciousTom Вы должны заставить пользователя ввести телефон или адрес электронной почты, пользователь вводит и то, и другое, или неверные данные отправляют неверный ответ.

Smartpal 23.04.2018 11:21

Вы не узнали, как по этому ответу определить, что такое строка? @PreciousTom

revo 23.04.2018 11:28

Ответ @PreciousTom revo почти правильный, добавьте еще с $ type = 'Invalid', затем проверьте тип, если он недействителен, отправьте неверный ответ пользователю.

Smartpal 23.04.2018 11:34

За несколько минут до вашего комментария я изменил ответ. @Smartpal

revo 23.04.2018 12:21

Другие вопросы по теме