簡體   English   中英

僅驗證美國電話號碼

[英]Validate U.S. Phone Numbers Only

我目前正在建立一個PHP網站,用戶可以通過SMS消息進行交互。 因此,我需要將他們的電話號碼存儲在數據庫中。 由於我現在僅允許在美國進行SMS交互,因此我需要檢查提交的電話號碼是否符合美國格式。 通常,這意味着幾件事: 1必須是第一個數字,區號不能以01開頭,並且不帶前導1的字符串必須是10位數字(3位區號加7位數字)。

盡管有所有這些要求,但我希望用戶可以隨意選擇自己喜歡的格式輸入他們的電話號碼,而不會引起錯誤。

忽略非數字是第一步。 並非所有電話公司都要求使用前導1,尤其是在新澤西州附近。 在此撥號會導致錯誤或錯誤的號碼。

區號不能為[2-9] 11或[2-9] 9 [0-9]。 以9為中心的區號保留給尚未確定的方案,以解決區號耗盡的問題。

交換也不能以0或1開頭,也不能為[2-9] 11。


這些限制用以下代碼表示:

$mobile = preg_replace ('/\D/', '', $trimmed['mobile']);

if ($mobile[0] == '1') $mobile = substr ($mobile, 1);  // remove prefix

$invalid = strlen ($mobile) != 10  ||
           preg_match ('/^1/',      $mobile) ||  // ac start with 1
           preg_match ('/^.11/',    $mobile) ||  // telco services
           preg_match ('/^...1/',   $mobile) ||  // exchange start with 1
           preg_match ('/^....11/', $mobile) ||  // exchange services
           preg_match ('/^.9/',     $mobile);    // ac center digit 9

在從搜索和精練中學到了什么之后,我找不到美國唯一的方法。 所以,這是我設計的:

首先,要允許任何輸入格式,請使用preg_replace刪除所有非數字字符。 [用戶可以使用所需的任何連字符或斜杠,但對我來說毫無用處。]

$mobile = preg_replace('/\D/', '', $trimmed['mobile']);

僅使用純數字串即可,消除任何前導1 ,這可以照顧到用戶包括前導1或以1開頭區號的任何情況。 [如果有效,這應該總是給我留下10位數字的字符串。]

$mobiletrim = ltrim($mobile, '1');

接下來,正則表達式檢查所修剪的電話號碼的長度是否恰好是10位數字,並且開頭不是0還是1

    if (preg_match ('/^[2-9]\d{9}$/', $mobiletrim) || empty($trimmed['mobile'])) {
        $mp = TRUE;
        if (!empty($trimmed['mobile'])) { $mobiletrim = "1" . $mobiletrim; }
    } else {
        $profile_errors[] = "Please enter a valid U.S. phone number.";
    }
if ($mp) { //Store Phone Number in db }

您可以在上面看到的最后一步是,如果用戶未提交空電話字段,則在將有效號碼存儲在數據庫中之前添加前導1 ,如果他們不希望存儲其號碼,則可以這樣做。 。


從技術上講,這將驗證所有NANP編號。 唯一將其從NANP縮小到美國范圍的唯一方法是通過解析當前美國區號列表來驗證是否使用了美國區號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM