2012-10-28 225 views
1

可能重複:
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

回答

1

兩件事情錯在這裏:

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

順便說一句 - 一個英國人制作網絡 - 我是英國人,選擇住在蘇格蘭。 –

1

兩個主要的事情,我看到:如果字符串是整整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 
);