我需要验证一个输入,稍后我需要根据数据库检查它是否存在于表中。输入必须是手机号码(所有数字,最长 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
两个问题,
有更好的方法吗?比如,使用 preg_match。
以上代码设法区分电子邮件和手机号码,稍后我需要将其与数据库进行匹配。在真实场景中,输入将由用户提供,
$credential = $_POST['credential'];
然后将相应地设置两个变量中的任何一个。我怎么知道设置了两个变量中的哪一个?如果我要将电子邮件匹配到电子邮件列或将手机号码匹配到移动列,我需要知道两者中哪一个有值,哪个为空。
最佳答案
filter_var($credential, FILTER_VALIDATE_EMAIL)
将比正则表达式执行得更好,因为这是专门设计的。
至于电话号码,这似乎有点不够熟或太严格了。许多人不假思索地添加空格、括号、连字符等。我认为对电话号码如此严格只会让人恼火。 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;
}
您的用户完全不会注意到这两种方法之间的速度差异。您应该选择您个人喜欢的方法。
关于php - 如何知道哪个变量有值,哪个为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855389/