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

Use of Preg_match to Determine Mobile Number or Email

我想问一下是否有更好的方法来确定输入的字符串是 phone 号码还是电子邮件,这是我已经可以使用的代码

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

但我担心的是,如果用户在同一个字符串中同时键入 phone 和电子邮件,那么 if 语句中的哪一个会被选中,哪个会被忽略?是我确定哪种类型的字符串合适还是有更有效的方法? 谢谢

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

您也应该将它们用于首次验证。您的 phone 数字验证缺乏良好的验证,因为它验证了任意字符串序列,例如 1------- --------5 看起来不像 phone 数字以及更多其他东西,因为它不匹配整个字符串(缺少两个提到的锚点)。所以我用 \d{10} 表示一个 10 位 phone 数字,您可能希望更改它以满足您自己的要求,这次更准确。

您也不是真的想要那种电子邮件验证。 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';
}