我需要验证一个输入,稍后我需要对照数据库检查它是否存在于表中。输入必须是手机号码(所有数字,最大长度为 10)或电子邮件地址。下面是我所做的

<?php

$credential = '9999999999';

if (ctype_digit($credential)) {
        $mobile_number = $credential;
        echo 'Mobile: '. $mobile_number;
    } elseif (filter_var($credential, FILTER_VALIDATE_EMAIL)) {
        $email = $credential;
        echo 'Email: '.$email;
    }

输出 $credential = '9999999999' ;
Mobile: 9999999999

输出 $credential = '[email protected]' ;
Email: [email protected]

两个问题,
  • 有没有更好的方法呢?比如,使用 preg_match。
  • 上面的代码设法区分电子邮件和手机号码,稍后我需要与数据库进行匹配。在实际场景中,输入将由用户提供,$credential = $_POST['credential']; 然后将相应地设置两个变量中的任何一个。我怎么知道设置了两个变量中的哪一个?如果我要将 email 与 email 列或手机号码与 mobile 列匹配,我需要知道两者中哪一个有值(value),哪一个为空。
  • 最佳答案

    filter_var($credential, FILTER_VALIDATE_EMAIL) 将比 regex 表现得更好,因为这是它专门设计的。

    至于电话号码,这似乎有点不成熟或过于严格。许多人不加思索地添加了空格、括号、连字符等。我认为,对电话号码如此严格只会令人恼火。关于电话号码验证,SO 上有很多正则表达式模式。需要对您预期的电话号码字符串有深入了解才能自信地回答这个问题。你只期待美国的数字吗?这是国际的吗?我们不知道,所以我不能说什么是最好的策略。

    这将起作用:

    if (ctype_digit($credential) && strlen($credential)==10) {
        $mobile_number = $credential;
        echo 'Mobile: '. $mobile_number;
    } elseif (filter_var($credential, FILTER_VALIDATE_EMAIL)) {
        $email = $credential;
        echo 'Email: '.$email;
    }
    

    这也将起作用:
    if (preg_match('/^\d{10}$/',$credential)) {
        $mobile_number = $credential;
        echo 'Mobile: '. $mobile_number;
    } elseif (filter_var($credential, FILTER_VALIDATE_EMAIL)) {
        $email = $credential;
        echo 'Email: '.$email;
    }
    

    这两种方法之间的速度差异对于您的用户来说是完全不明显的。您应该选择您个人喜欢的任何方法。

    10-08 14:15