1. 程式人生 > 實用技巧 >PHP 正則匹配手機號

PHP 正則匹配手機號

PHP 正則匹配手機號(國內)

PHP提供了多種內建的正則匹配函式,如php_filter()php_grep()php_match_all()等,最重要的是我們要根據要判定的資料要求,來精準判定,以此來達到最後的目的。

本次,我們判定國內的手機號格式,要求:不匹配衛星電話的號段

電信網編號總覽

序號號碼長度備註正則規則
1 13x 11 公眾行動通訊網網號 ^13(4[0-8]\d{7}|[0-3|5-9]\d[0-9]\d{8})$
2 1349 11 公眾行動通訊網網號,衛星行動通訊業務專用號段 ^1349\d{7}$
3 140XX 13 中國聯通物聯網網號 ^140\d{10}$
4 141XX 13 中國電信物聯網網號 ^141\d{10}$
5 142XX~143XX 13 物聯網網號 ^142\d{10}$
6 144XX 13 中國移動物聯網網號 ^144\d{10}$
7 145~149 11 公眾行動通訊網網號 ^14[5-9]\d{8}$
8 15X 11 公眾行動通訊網網號 ^15\d{9}$
9 161~162 11 公眾行動通訊網網號 ^16[1-2]\d{8}$
10 164~167 11 公眾行動通訊網網號 ^16[4-7]\d{8}$
11 170~178 11 公眾行動通訊網網號 ^17[0-8]\d{8}$
12 174 11 公眾行動通訊網網號,衛星行動通訊業務專用號段 ^174\d{8}$
13 18X 11 公眾行動通訊網網號 ^18\d{9}$
14 19X 11 公眾行動通訊網網號 ^19\d{9}$

標記為公眾行動通訊網網號的為運營商可以使用的、用於個人通訊業務的號段。
開放的號段並非全部都已使用,只是指運營商可以在其內開展、經營業務。

移動

序號運營商號碼長度備註正則規則
1 中國移動 134~139 11 公眾行動通訊網網號,1349除外 ^13(4[0-8]\d{7}|[5-9]\d{8})$
2 中國移動 147 11 公眾行動通訊網網號,TD資料卡專用 ^147\d{8}$
3 中國移動 150~152 11 公眾行動通訊網網號 ^15[0-2]\d{8}$
4 中國移動 157~159 11 公眾行動通訊網網號 ^15[7-9]\d{8}$
5 中國移動 172 11 公眾行動通訊網網號,2014新增 ^172\d{8}$
5 中國移動 178 11 公眾行動通訊網網號,2014新增 ^178\d{8}$
6 中國移動 182~184 11 公眾行動通訊網網號 ^18[2-4]\d{8}$
7 中國移動 187~188 11 公眾行動通訊網網號,188TD專用 ^18[7-8]\d{8}$
8 中國移動 198 11 公眾行動通訊網網號 ^198\d{8}$

聯通

序號運營商號碼長度備註正則規則
1 中國聯通 130~132 11 公眾行動通訊網網號 ^13[0-2]\d{8}$
2 中國聯通 145~146 11 公眾行動通訊網網號,145TD資料卡專用 ^14[5-6]\d{8}$
3 中國聯通 155~156 11 公眾行動通訊網網號 ^15[5-6]\d{8}$
4 中國聯通 166 11 公眾行動通訊網網號 ^166\d{8}$
5 中國聯通 175~176 11 公眾行動通訊網網號 ^17[5-6]\d{8}$
6 中國聯通 185~186 11 公眾行動通訊網網號 ^18[5-6]\d{8}$

電信

序號運營商號碼長度備註正則規則
1 中國電信 133 11 公眾行動通訊網網號 ^133\d{8}$
2 中國電信 149 11 公眾行動通訊網網號 ^149\d{8}$
3 中國電信 153 11 公眾行動通訊網網號 ^153\d{8}$
4 中國電信 173 11 公眾行動通訊網網號 ^173\d{8}$
5 中國電信 177 11 公眾行動通訊網網號 ^177\d{8}$
6 中國電信 180 11 公眾行動通訊網網號 ^180\d{8}$
7 中國電信 181 11 公眾行動通訊網網號 ^181\d{8}$
8 中國電信 189 11 公眾行動通訊網網號 ^189\d{8}$
9 中國電信 191 11 公眾行動通訊網網號 ^191\d{8}$
10 中國電信 199 11 公眾行動通訊網網號 ^199\d{8}$

綜合匹配正則

^1((34[0-8]\d{7})|((3[0-3|5-9])|(4[5-7|9])|(5[0-3|5-9])|(66)|(7[2-3|5-8])|(8[0-9])|(9[1|8|9]))\d{8})$

上述正則有能力優化的同學請留下你的作業o(*^@^*)o

示例

// PHP 正則校驗手機號合法性
function check_phone_num($phone_num) {
    if (preg_match("/^1((34[0-8]\d{7})|((3[0-3|5-9])|(4[5-7|9])|(5[0-3|5-9])|(66)|(7[2-3|5-8])|(8[0-9])|(9[1|8|9]))\d{8})$/", $phone_num)) {
        echo "合法\n";
    } else {
        echo "不合法\n";
    }
}

// 測試
check_phone_num(1589890023); //不合法
check_phone_num(13492787590); //不合法
check_phone_num(17612343210); //合法
check_phone_num(16199008987); //不合法
check_phone_num(17099008987); //不合法

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

提示

  1. 嚴格意義上來講,類似這種/^1[34578]\d{9}$/寫法是不夠嚴謹的,可能造成後續簡訊驗證號碼為空的情況,從而喪失獲取手機號的作用;
  2. 根據需求需要對一些特別號段,比如上述號段在匹配時,我們不允許衛星電話號段註冊;
  3. 需要關注工信部相關的新聞,及時更新匹配規則。

勘誤

歡迎各位發現數據存在問題的同學及時評論勘誤!


資料來源:

  1. 電信網編號計劃(2017年版)
  2. 百度知道-184號段是中國移動的嗎?
  3. 百度知道-目前中國聯通的號段有哪些
  4. 百度知道-中國電訊號碼段都有哪些