【问题标题】:Validate Phone Number and Zip Code PHP验证电话号码和邮政编码 PHP
【发布时间】:2012-08-13 21:34:04
【问题描述】:

我正在尝试验证电话号码,并要求它只有 10 位数字,不允许使用空格或特殊字符(例如:0123456789),除了 5 位数字外,邮政编码也是如此(例如:01234)。

到目前为止,这就是我的电话号码字段。

$phone = stripslashes($_POST['phone']);

if(!$phone || $phone == "Phone Number*")
{
$error .= "Please enter your phone number.<br />";
}

下一个 if 语句应检索类似于“请输入有效的电话号码。例如:“0123456789”的错误。

【问题讨论】:

    标签: php html css post


    【解决方案1】:

    如果你不想用regular expressions,看看ctype_digit

    例如:

    if(strlen($phone)==10 && ctype_digit($phone)) {
        //valid
    } else {
        //invalid
    }
    

    我无法证明这是否会比正则表达式更快或更慢,但我认为它可能没有实际意义。这或多或少对你来说最有意义。

    【讨论】:

      【解决方案2】:

      您可以在这里尝试正则表达式:

      if(preg_match('/^[0-9]{10}$/', $phone)){
          // valid
      }else{
          // Not valid
      }
      

      有点类似的东西将确保只有数字字符和其中的 10 个字符。只需将邮政编码的 10 更改为 5。

      如果您在访问时未设置$_POST['phone'],您将获得E_NOTICE,所以这里只是给您一个提示:

      $phone = isset($_POST['phone']) ? stripslashes($_POST['phone']) : null;
      
      if(!$phone) // ERROR
      

      【讨论】:

      • 不需要 > 0 FYI
      【解决方案3】:
      $phone = stripslashes($_POST['phone']);
      
      if(!$phone || $phone == "Phone Number*")
      {
      $error .= "Please enter your phone number.<br />";
      }
      
      if(!preg_match('/^\d{10}$/', $phone)) $error .= "Please enter phone number as ##########.<br />";
      

      邮政编码

      if(!preg_match('/^\d{5}$/', $zip)) $error .= "Please enter your zip code as #####.<br />";
      

      请记住,这将不允许外国邮政编码(可能有不同的长度或包含字母)


      还有一些其他建议(以防止不必要的错误消息)

      您可能希望通过执行类似操作来处理用户输入,使 123-456-7890 变为 1234567890

      preg_replace('/[^\d]/','',$input)

      也许做一个trim($input) 去除前导/尾随空格


      最后,您在 $_POST['phone'] 上使用带斜杠有什么特别的原因吗? 如果它们都是您期望的数字,那么这不是必需的。 如果它们不是全数字,那么无论如何你都会抛出错误

      【讨论】:

      • 感谢您的回复,对于未来需要外国邮政编码的项目,我会牢记这一点。
      【解决方案4】:

      怎么样:

      function check($number,$length)
      {
        if(ctype_digit ($number) && strlen($number)==$length)
          return true;
        else
          return false;
      }
      
      
      if(check("1234",4))
        echo "ok";
      else
        echo "Please enter a valid phone number. Example: "0123456789";
      

      【讨论】:

        【解决方案5】:

        好吧,这是一个旧帖子,但无论如何我都会在这里添加一些 cmets。

        1) 你真的不应该强迫用户输入正确的数字,当然你在前端的验证会涵盖这一点,但永远不要假设它是进入“后端”的情况。

        考虑以下内容,而不是将其放在用户身上:

        // remove chars
        $number = preg_replace('/[\D]/', '', $number);
        
        //unit test sanitizer
        filter_var($number, FILTER_SANITIZE_NUMBER_INT)
        
        // check number
        preg_match('/^[0-9]{10}$/', $zip)
        

        示例:如果在查找最接近的匹配邮政编码等中输入了足够多的数字,则读取用户输入。(我实际上曾在网站上使用过一次)当然,将前端设置为检查是有用的,但以防万一失败。

        $number = 'z 02012s';
        
        // remove chars
        $number = preg_replace('/[\D]/', '', $number);
        
        //unit test sanitizer
        $number = filter_var($number, FILTER_SANITIZE_NUMBER_INT);
        
        // check number
        if (preg_match('#^[0-9]{5}$#', $number) === 1) {
            //(optional) lookup closest zip using your DB.
            $look_zip = $db->getClosestZipMatch($number);
        } else {
            echo $number . " isn't 5 digits only, do something.";
        }
        

        【讨论】:

        • 虽然这个概念适用于电话号码,但它不适用于合法地以一个或多个零开头的邮政编码。更糟糕的是,邮政编码可以有 5 或 9 个数字(不是 10,只有分隔符)是合法的。
        • @JBH 我给你提供了一个例子。
        猜你喜欢
        • 1970-01-01
        • 2018-05-05
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多