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[34578]\d{9}$/
寫法是不夠嚴謹的,可能造成后續短信驗證號碼為空的情況,從而喪失獲取手機號的作用; - 根據需求需要對一些特別號段,比如上述號段在匹配時,我們不允許衛星電話號段注冊;
- 需要關注工信部相關的新聞,及時更新匹配規則。
勘誤
歡迎各位發現數據存在問題的同學及時評論勘誤!
數據來源:
轉自:https://blog.csdn.net/Chinakeep/article/details/106093218?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf