【问题标题】:Use of Preg_match to Determine Mobile Number or Email使用 Preg_match 确定手机号码或电子邮件
【发布时间】:2018-04-22 19:56:44
【问题描述】:

我在问是否有更好的方法来确定输入的字符串是电话号码还是电子邮件,这是我已经工作的代码

    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 语句,哪个会被忽略?我是确定哪种类型的字符串合适还是有更有效的方法? 谢谢

【问题讨论】:

标签: php regex preg-match


【解决方案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';
}

【讨论】:

  • 您可以使用 filter_var 减少电子邮件验证正则表达式。 filter_var($invitation, FILTER_VALIDATE_EMAIL)
  • 是的,这是一个选择,我更喜欢它。我的答案中的链接指向此过滤器使用的相同 rfc。
  • @Smartpal 我也用它来进行验证,但确定字符串是什么,这里的实际情况是正确的方法
  • @PreciousTom 您必须强制用户输入电话或电子邮件,用户同时输入两者或无效数据发送无效响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 2022-06-16
  • 2019-07-30
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多