如何知道哪个变量有值,哪个为空?

How to know which variable has a value and which one is null?

我需要验证一个输入,稍后我需要对照数据库检查它是否存在于 table 中。输入必须是手机号码(所有数字,最长 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 = 'abc@gmail.com'输出

Email: abc@gmail.com

两个问题,

  1. 有没有更好的方法呢?比如,使用 preg_match.

  2. 以上代码设法区分电子邮件和手机号码,稍后我需要将其与数据库进行匹配。在真实场景中,输入将由用户提供,$credential = $_POST['credential']; 然后将相应地设置两个变量中的任何一个。我怎么知道设置了两个变量中的哪一个?如果我要将电子邮件匹配到电子邮件列或将手机号码匹配到移动列,我需要知道两者中哪个有值,哪个为空。

filter_var($credential, FILTER_VALIDATE_EMAIL) 将比正则表达式执行得更好,因为这是专门设计的。

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

这会起作用:

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

您的用户完全不会注意到这两种方法之间的速度差异。您应该选择您个人喜欢的方法。

这就是您可以使用 PHP

实现的方法
if (preg_match('/^\d{10}$/', $string) || filter_var($string, FILTER_VALIDATE_EMAIL)) {
    //valid
} else {
    //invalid
}

但是,您也应该在客户端对此进行验证,以确保即使值无效也不会向服务器发送请求。

编辑:

if (preg_match('/^\d{10}$/', $string)) {
    //valid mobile
} else if (filter_var($string, FILTER_VALIDATE_EMAIL)) {
    //valid email
} else {
    //invalid
}

感谢您回答我的第一个问题。对于第二部分,如果您有兴趣,我找到了这个http://php.net/manual/en/function.is-null.php(未测试)。