2012-08-23 74 views
1

多種格式我有一個設置使用的preg_match以驗證電話號碼字段:驗證用的preg_match

function ValidPhone($phone) { 
    return preg_match('/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/', trim($phone)); 
} 

這保證了電話號碼的XXX-XXX-XXXX格式的形式進入它是數字。

我對regexp不是很熟悉;誰能告訴我如何擴大這個允許多種格式?即xxx xxx xxxx或xxx.xxx.xxxx或(xxx)xxx-xxxx

謝謝。

+0

如果使用正則表達式匹配,你需要知道你需要支持什麼格式。我認爲Sean下面會提出一個更好的選擇。一個匹配多個或兩個格式的正則表達式會非常複雜。 – Andrew

+0

不幸的是,我們確實需要匹配確切的格式,我在OP中提到的格式。 – EmmyS

回答

5

我認爲最簡單的解決辦法是剛去掉一切不是數字第一:

function ValidatePhone($phone) { 
    $phone = preg_replace('/\D+/', '', $phone); 
    return strlen($phone) == 10; 
} 

既然你要驗證的格式,而不是內容,這應該這樣做:

function ValidatePhone($phone) { 
    $patterns = array(
     '\d{3}([-\. ])\d{3}\g{-1}\d{4}', 
     '\(\d{3}\) \d{3}-\d{4}' 
     ); 

    $phone = trim($phone); 

    foreach ($patterns as $pattern) { 
     if (preg_match('/^' . $pattern . '$/', $phone)) 
      return true; 
    } 

    return false;                             
} 
+0

不幸的是,這不是我們所需要的。我們需要驗證非常具體的格式,即我在OP中提到的格式。 – EmmyS

+0

已更新。另外,如果這是爲了在用戶界面中驗證用戶提供的數據,請爲用戶提供一個幫助,並且更加寬容您接受的內容。理想情況下,您只能存儲電話號碼的10位數字(假設爲NPA編號),然後將其格式化,然後在返回到用戶界面的過程中進行格式化。 –

+0

謝謝。我會試試看。它部分用於用戶提供的數據,但是使用相同的腳本來驗證我們從外部服務收到的數據,因此驗證必須在我們收到數據時完成,而不是在輸入數據時完成。 – EmmyS

0

對於美國的電話號碼:

\(?[2-9]\d\d)?[ -\.]?[2-9]\d\d[ -\.]?\d{4} 
0
(\d{3} \d{3} \w{4})|(\d{3}-\d{3}\-\d{4})|(\d{3}\.\d{3}\.\d{4}) 

\d:一位數[0-9]

\d{3}:三一位數

|:邏輯或