开发指南:如何正确验证中国大陆手机号码?
在注册、登录或表单提交场景中,验证手机号码的有效性是不可或缺的一环。本文将为您详细梳理中国大陆手机号码的规则,并提供实用的代码解决方案。
大陆手机号的基本规则
中国大陆的手机号码是一个固定长度为 11 位 的数字字符串。
其结构通常分为三部分:
- 前 3 位:网络识别号(即我们常说的“号段”),由工信部统一分配给三大运营商(移动、联通、电信)以及广电和虚拟运营商。
- 第 4-7 位:地区编码(HLR,归属地)。
- 第 8-11 位:用户号码。
常见号段分布(截至2024年)
- 中国移动:134-139, 147, 148, 150-152, 157-159, 172, 178, 182-184, 187, 188, 195, 198
- 中国联通:130-132, 145, 146, 155, 156, 166, 175, 176, 185, 186, 196
- 中国电信:133, 149, 153, 173, 174, 177, 180, 181, 189, 191, 193, 199
- 中国广电:192
注:随着携号转网政策的普及,通过号段来判断运营商已经不再 100% 准确,但用于初步验证仍然有效。
正则表达式验证方案
在开发中,我们应该使用多严格的正则来校验手机号?这取决于你的业务场景。
方案一:最宽松的验证(推荐)
随着新号段的不断发放,过于严格的正则需要频繁维护更新。目前业界最推荐的宽松验证方式是:只要是 1 开头,且共 11 位数字即可。
const regex = /^1[3-9]d{9}$/;
// 测试
regex.test("13812345678"); // true
regex.test("19212345678"); // true
regex.test("23812345678"); // false
解析:
^和$:表示匹配整个字符串的开头和结尾。1:第一位必须是 1。[3-9]:第二位目前分配了 3 到 9 的数字。d{9}:后面跟着 9 个任意数字。
方案二:严格验证(不推荐用于 C 端产品)
如果你确实需要非常严格地匹配目前已知的号段(例如内部业务系统限制),可以使用以下正则,但请注意必须定期维护:
const strictRegex = /^(?:(?:+|00)86)?1(?:(?:3[d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[d])|(?:9[189]))d{8}$/;
验证之后:查询归属地
验证格式正确后,很多业务还需要知道该号码的归属省份和城市(例如用于风险风控或地域数据统计)。
如果您需要查询某个具体手机号的归属地和运营商,可以使用我们免费提供的 手机号归属地查询工具,无需调用复杂的 API 即可在线查看详细信息。