1

我在我的网站上创建了一个联系表格,并希望验证电话号码是否完全由数字组成,如果输入了前导零,则包括前导零。

我的sendmail.php文件中有以下代码:

if ( empty($_REQUEST['phone']) ) {
    $pass = 1;
    $alert .= $emptyphone;
} elseif (preg_match('/^[0-9]+$/', $_REQUEST['phone'] ) ) { 
    $pass = 1;
    $alert .= $alertphone;

此代码应检查该字段phone以查看它是否完全由数字组成。

如果没有,它会调用消息$alertphone告诉用户有问题。

4

2 回答 2

4

验证电话号码并不像目前建议的那么简单。您不仅需要检查电话号码是否仅包含数字,还必须确保其长度正确。您还需要确保您不会让最终用户难以......使用......否则您最终会失去客户。

例子:

如果我输入我的电话号码,因为09999 999 999它将无法通过您的系统验证。因为它包含空格,所以很多人确实以这种方式和其他更复杂的方式输入电话号码。

代码

if(empty($_REQUEST['phone'])){
    //Empty phone number
}
else if(preg_match('/^(0\d{10}|[1-9]\d{9})$/', $_REQUEST['phone'], $matches)){
    //Good phone number
}
else{
    //Bad phone number
}

正则表达式解释

  1. ^- 字符串的开始
  2. (- 开始一个捕获组
  3. 0\d{10}- 匹配一个 0 后跟另外 10 个数字
  4. |- ...或者...
  5. [1-9]\d{9}- 匹配一个非 0 数字后跟 9 个其他数字
  6. )- 关闭捕获组
  7. $- 匹配字符串结尾

附加检查

人们经常添加空格或括号/标点符号以使电话号码更易于人类阅读/记住。电话号码输入的一些示例可能是:

  • (00000) 999 999
  • (0)9999 999 999
  • 09999 999 999
  • 09999999999
  • 9999999999

这些都是有效的电话号码,但不会被您的系统接受...

要解决此问题(并使用户的生活更轻松),您将从电话号码中删除不是数字的字符,然后检查其长度。

$phoneNumber = "(09999) 999 999";
$phoneNumber = preg_replace('/[^\d]/', '', $phoneNumber); //Replace non-numbers with nothing
echo $phoneNumber; //Outputs: 09999999999

关于安全的说明

强烈建议您不要使用$_REQUEST,而是使用$_POSTor$_GET作为额外的安全步骤。明确使用您期望数据通过的方法是确保请求合法的又一验证步骤。

于 2013-09-26T22:10:05.423 回答
1

elseif (!preg_match('/^[0-9]+$/', $_REQUEST['phone'] ) ) {应该做的工作。由于您使用的 RegEx 代表正确的电话号码,因此您需要在找到匹配项时发出警告,而不是在找到匹配项的情况下发出警告。

于 2013-09-26T21:25:50.603 回答