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. 严格意义上来讲,类似这种/^1[34578]\d{9}$/写法是不够严谨的,可能造成后续短信验证号码为空的情况,从而丧失获取手机号的作用;
  2. 根据需求需要对一些特别号段,比如上述号段在匹配时,我们不允许卫星电话号段注册;
  3. 需要关注工信部相关的新闻,及时更新匹配规则。

勘误

欢迎各位发现数据存在问题的同学及时评论勘误!


数据来源:

  1. 电信网编号计划(2017年版)
  2. 百度知道-184号段是中国移动的吗?
  3. 百度知道-目前中国联通的号段有哪些
  4. 百度知道-中国电信号码段都有哪些

 

转自: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

posted @ 2020-09-17 18:23  nxmxl  阅读(4289)  评论(0编辑  收藏  举报