如何知道哪个变量有值,哪个为空?
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
两个问题,
有没有更好的方法呢?比如,使用 preg_match.
以上代码设法区分电子邮件和手机号码,稍后我需要将其与数据库进行匹配。在真实场景中,输入将由用户提供,$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(未测试)。
我需要验证一个输入,稍后我需要对照数据库检查它是否存在于 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
两个问题,
有没有更好的方法呢?比如,使用 preg_match.
以上代码设法区分电子邮件和手机号码,稍后我需要将其与数据库进行匹配。在真实场景中,输入将由用户提供,
$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(未测试)。