使用Preg_match确定手机号码或电子邮件

时间:2018-04-22 19:56:45

标签: php regex 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语句中的哪一个会被选中而哪些会被忽略?并且我的方法是确定哪种类型的字符串适当或是否有更有效的方法? 感谢

1 个答案:

答案 0 :(得分:1)

您在第二个正则表达式中用于验证电子邮件地址的所有正则表达式风格中几乎有两个锚点,分别显示为^$,分别表示输入字符串的开头和结尾

您也应该使用它们进行首次验证。您的电话号码验证缺乏良好的验证,因为它验证了1------- --------5之类的任意字符串序列,这些字符串看起来不像电话号码和更多的东西,因为它与整个字符串不匹配(缺少都提到了锚点)。所以我使用\d{10}来表示一个10位数的电话号码,您可能希望更改它以满足您自己的要求,这次更精确。

您也不想要那种电子邮件验证。 Something more simpler is better

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';
}