有问题的preg_match和数字

时间:2013-09-26 21:22:15

标签: php regex preg-match phone-number

我在我的网站上创建了一个联系表格,并希望确认该电话号码仅由数字组成,包括一个前导零(如果输入的话)。

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

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

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

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

2 个答案:

答案 0 :(得分: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. $ - 匹配字符串结尾
  8. 附加检查

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

    • (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作为额外的安全步骤。明确使用您期望数据通过的方法是确保请求合法的另一个验证步骤。

答案 1 :(得分:1)

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