preg_match和数字的问题


Trouble with preg_match and numbers

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

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

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

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

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

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

例:

如果我输入我的电话号码作为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,而是使用$_POST$_GET作为额外的安全步骤。显式使用您希望数据通过的方法是确保请求合法的另一个验证步骤。

elseif (!preg_match('/^[0-9]+$/', $_REQUEST['phone'] ) ) {应该可以完成这项工作。由于您使用的正则表达式代表正确的电话号码,因此如果没有找到匹配项,则需要发出警告,而不是在找到匹配项的情况下发出警告。