2009-10-13 98 views
0

使用PHP,我如何驗證手機#是否格式正確?PHP:如何驗證電話號碼,如果格式正確?

最簡單的方法是簡單地去除所有非數字數據,只留下數字。然後檢查是否存在10位數字。

這是最好的和最簡單的方法嗎?

+2

有些人不住在+1區:我的電話號碼全部開始+44。國際號碼不必*在國家代碼後有10位數字。當然,有很多不想打國際長途電話的好理由;-) – 2009-10-13 17:37:16

+0

這是否假設您只查找美國/加拿大的電話號碼?一旦你達到國際前綴(德國+49)和/或特定的國家規則(例如在德國,並不是所有的電話號碼都具有相同的長度),事情就會變得非常棘手。 – Thorsten 2009-10-13 17:38:45

+0

是的,僅限美國 – JacobT 2009-10-13 17:49:32

回答

0

您可以使用正則表達式吧:

$pattern_phone = "|^[0-9\+][0-9\s+\-]*$|i"; 
if(!preg_match($pattern_phone,$phone)){ 
    //Somethings wrong 
} 

沒有測試正則表達式,所以它可能不是100%正確。

+1

這取決於OP的要求。但我懷疑這是100%正確的。你的正則表達式會匹配像'+'或'0 ----------'或'9 9'這樣的字符串,僅舉幾個假的數字。 – 2009-10-13 17:38:44

0

剝離後檢查10位數將檢查語法,但不檢查有效性。爲此,您需要確定該區域/國家/地區可用的有效數字,並可能編寫一個正則表達式來匹配模式。

+0

NANP http://en.wikipedia.org/wiki/North_American_Numbering_Plan指定美國和加拿大的有效號碼。 – 2009-10-13 19:03:50

-2

你需要什麼格式?你可以使用正則表達式。

+0

對不起,我把這個問題解釋錯了。 – Cesar 2009-10-13 17:45:33

2

最好?我用這種方法看到的問題:

  • 某些區號 - 例如000 - ### - #### - 無效。請參閱http://en.wikipedia.org/wiki/List_of_NANP_area_codes
  • 某些交易所(如### - 555 - ####)無效。見http://en.wikipedia.org/wiki/555_%28telephone_number%29
  • 有些人會在他們的號碼前輸入1,即1 - ### - ### - ####。
  • 有些人只能以擴展名訪問,例如### - ### - #### x ####。
  • 一些公司採用額外的數字,如1-800-GO-FLOWERS。額外的數字被電話系統忽略,但用戶可能希望能夠輸入整個事情。
  • 即使您打折國家代碼,國際電話號碼也不一定是10位數字。

夠好嗎?很可能,但這取決於你和你的應用程序。

+0

作爲一種確定用戶輸入電話號碼的方式,您建議做什麼? – JacobT 2009-10-13 17:34:35

+0

取決於您需要的有效性水平。如果它的任務關鍵,我會有一個像http://www.twilio.com/這樣的系統嘗試發起一個真正的電話號碼。如果我沒有將這些數據用於任何重要的事情,那麼您的方法就足夠了。這一切都取決於應用程序。 – ceejayoz 2009-10-13 17:36:01

+3

我建議你不要檢查電話號碼。如果他們搞砸了,讓用戶處理後果。與流行的觀點相反,人們不會經常搞亂形式,而當他們這樣做時,通常在提交之前就會發現他們的錯誤。 – 2009-10-13 17:36:44

0

像這樣驗證/過濾數據的問題通常歸結爲這個問題的答案:「我想成爲多嚴格?」然後進入一系列「功能」問題

  • 你打算接受國際號碼嗎?
  • 你打算接受擴展嗎?
  • 你要允許不同的格式,即,(111)222-3333 VS 111.222.3333

根據業務規則,對這些問題的答案可能會有所不同。但是是最靈活的,我推薦3場拿電話號碼

  1. 國家代碼(可選)
  2. 電話號碼
  3. 擴展(可選)

全部3場可編程限制/只爲數字值過濾。然後,您可以將它們合併成一些可解析格式,或單獨存儲每個值。

+1

剝離非數字字符將消除各種格式的問題。 – ceejayoz 2009-10-13 17:37:01

0

如果某件事情是「最好的」事情,那麼回答幾乎是不可能的(除非你是回答你自己的問題的人)。

你建議了,剝離所有非數字,然後檢查是否有10位數字,可能會導致不必要的行爲像一個字符串的方式:

喬治·華盛頓(1732年2月22日 - 月14,'99)是美國革命戰爭中的大陸軍司令 並擔任 作爲美國的第一位總統 。

因爲剝離所有非數字將導致該字符串2217321499這是10個fdigits長,但我非常懷疑整個字符串應該被視爲一個有效的電話號碼。

+0

剝離所有字符的更常見問題是某人以'### - ### - #### x ####''的格式輸入其擴展名。 – ceejayoz 2009-10-13 17:38:12