2012-06-11 84 views
3

我正在尋找一些方法來驗證PHP中的電話號碼,這些電話號碼可以以任何存在的各種格式輸入。如果有幫助,我可以將問題的域名限制爲美國的電話號碼(或國際號碼 - 一個或另一個,但不能同時爲兩個)。PHP:電話號碼解析

我試過尋找自定義過濾器filter_var(),相當於strtotime()的電話號碼,或只是普通的香草解析庫,但沒有多少運氣。

如果需要,我可以設計定製的解決方案,但我不希望如果已經存在,是因爲A)我的肯定不會是那樣強勁,和B)我不喜歡重新發明輪子。

+5

使用正則表達式 – Quantastical

回答

1

使用正則表達式,以下內容將匹配3334445555,333.444.5555,333-444-5555,3334444555,(333)4445555及其所有組合。 然後替換所有那些(333)444-5555

preg_replace('\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})', '(\1) \2-\3', $text); 
+0

我還應該指出,如果您不確定數字是否有效並且想返回錯誤(如果上述返回false),則可以將上述內容放在if語句中。 – Exupery

0

「解析」的電話號碼是不是一個原生PHP的事情。

您需要指定自己什麼是'有效'的電話號碼簿 - 這應該通過驗證對指定格式或正則表達式的輸入來完成。

PHP無法知道'有效數字'是什麼。

+0

關於日期/時間也可以這麼說,但儘管在國內和國際上有不同的可能格式的數量可笑,但是「strtotime()」和等價物本身就存在。它使用「最佳猜測」解析算法,這就是我正在尋找的一切。 – FtDRbwLXw6

+0

@drrcknlsn我不同意; [文檔](http://php.net/manual/en/datetime.formats.php)清楚地說明了'strtotime()'認爲有效和可分析的輸入。 – Repox

+0

如果PHP能夠根據一組明確定義的規則知道有效的日期/時間是什麼,那麼絕對沒有理由不知道什麼是有效的電話號碼。事實上,它本身不可能是因爲沒有人花時間去實現它。不是因爲它無法完成。這就是我所說的。 – FtDRbwLXw6

0

我不知道所有美國的電話號碼格式,但我猜這是你可以擴展一個總體思路:

function validate_phone($phone) { 
    // replace everything except numbers 
    $phone = preg_replace('~[^\dx]~', '', $phone); 

    return preg_match('~^\d{11}(x\d{4})?$~', $phone); 
} 


// $phone = 12345678901; 
$phone = '1-234-567-8901x1234'; 
$valid = filter_var($phone, FILTER_CALLBACK, array(
    'options' => 'validate_phone' 
)); 

if ($valid) { 
    echo "It's valid!"; 
}; 

此代碼支持或十位數字(破折號,空格,內部點)和擴展格式與x2134後綴。