电话号码验证PHP

电话号码验证PHP

问题描述:

可能重复:
A comprehensive regex for phone number validation
PHP: Validation of US Phone numbers电话号码验证PHP

我想使用的preg_match以验证电话号码,但任何时候我在正确的格式键入电话号码(111)111-1111,它返回无效的字符错误,而不是真实的。我不认为这有什么不对我正则表达式(据我所知),所以我猜有什么毛病我的逻辑

function validate_phone_number($phoneNumber, $requiredLength = 14) 
{ 

     //Check to make sure the phone number format is valid 
    for ($i = 0; $i < strlen($_POST[$phoneNumber]); $i++){ 
      if(preg_match('/^\(\d{3}\) \d{3}-\d{4}\$/', $_POST[phoneNumber]{$i})) 
      { 
       return true; 
      } 
      else 
      { 
       return "<h3>" . "The phone number you entered contains invalid characters" . "</h3>"; 
      } 

     //Check to make sure the number is the required length 
      if (strlen($_POST[$phoneNumber]) > $requiredLength) { 
       return "<h3>" . "The phone number you entered contains too many characters" . "</h3>"; 
      } 
      else if (strlen($_POST[$phoneNumber]) < $requiredLength) { 
       return "<h3>" . "The phone number you entered does not contain enough characters" . "</h3>"; 
      } 
     } 
     return true; 
} 

我用什么来调用函数

if (count($_POST) > 0) { 
    $error = array(); 


    $phone = validate_phone_number('phoneNumber'); 
     if($phone !==true) { 
      $error[] = $phone; 

     } 


     if (count($error) == 0) { 

      //Phone number validates 

     } 

     else { 
      echo "<h2>Error Message:</h2>"; 

      foreach($error as $msg) { 
      echo "<p>" . $msg . "</p>"; 
      } 
     } 
     } 
+0

很多电话号码不符合该格式。 – 2012-10-28 18:47:02

+0

我发现了一件似乎错误的事情:'validate_phone_number()'对'$ _POST'具有它不应该有的依赖。相反,将函数需要的所有内容都传递给参数。这可能是错误,你可能想用第一个函数参数替换它。 – hakre

+0

我假设你是美国专用网站?我提到这是因为这是因为您使用的手机格式在世界上大多数国家都是错误的。 – Spudley

两件事情错在这里:

for ($i = 0; $i < strlen($_POST[$phoneNumber]); $i++){ 
     if(preg_match('/^\(\d{3}\) \d{3}-\d{4}\$/', $_POST[phoneNumber]{$i})) 

首先你用phoneNumber裸不变。但在其他代码中,您使用$phoneNumber作为名称参考。改变这一点。 (更好的是,将$ value传递给你的函数,而不是$ _POST的引用键)。

其次,你似乎在迭代它字符明智{$i}。但是正则表达式应该应用于整个字符串。遏制for

function validate_phone_number($phoneNumber, $requiredLength = 14) 
{  
    //Check to make sure the phone number format is valid 
    if (preg_match('/^\(\d{3}\) \d{3}-\d{4}\$/', $_POST[$phoneNumber])) 
    { 

长度检查完全是多余的,因为正则表达式已经声明了你的固定格式。

+1

这个正则表达式在英国不起作用。 –

+0

@Dagon - Bugger - 我错过了那次会议!是星期一早吗? –

+0

顺便说一句 - 一个英国人制作网络 - 我是英国人,选择住在苏格兰。 –

两个主要的事情,我看到:如果字符串是整整14

'/^\(\d{3}\) \d{3}-\d{4}\$/' 
         ^- wrong. leave it out: 

'/^\(\d{3}\) \d{3}-\d{4}$/' 

正如你先测试正则表达式,它只会匹配:

你必须用正则表达式的问题字符。因此,以后检查字符串长度是没有必要的。

你也应该考虑到利用filter_var功能,一个例子:

$options['options'] = array('regexp' => '/^\(\d{3}\) \d{3}-\d{4}$/'); 
$valid = filter_var($number, FILTER_VALIDATE_REGEXP, $options); 

它也有一个妹妹filter_input功能,能够对输入$_POST操作。可能会得心应手:

$options['options'] = array('regexp' => '/^\(\d{3}\) \d{3}-\d{4}$/'); 
$valid = filter_input(
    INPUT_POST, 'phoneNumber', FILTER_VALIDATE_REGEXP, $options 
);