我需要验证一个输入,我需要稍后检查数据库是否存在于表中。输入必须是手机号码(所有数字,10最大len)或电子邮件地址。以下是我的所作所为
<?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'];
,然后相应地设置两个变量中的任何一个。我如何知道设置了哪两个变量?如果我要将电子邮件与电子邮件列或手机号码匹配到移动列,我需要知道其中哪一个有价值,哪一个有空。
答案 0 :(得分:3)
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;
}
两种方法之间的速度差异对用户来说完全不明显。你应该选择你个人喜欢的方法。
答案 1 :(得分:2)
感谢您回答我的第一个问题。对于第二部分,如果您感兴趣,我发现了http://php.net/manual/en/function.is-null.php(未经测试)。
答案 2 :(得分:1)
这是你用PHP实现的方法
./program
但是,您也应该在客户端验证这一点,以确保如果值无效,请求甚至不会发送到服务器。
编辑:
if (preg_match('/^\d{10}$/', $string) || filter_var($string, FILTER_VALIDATE_EMAIL)) {
//valid
} else {
//invalid
}