校验手机号的基本规则
中国大陆手机号为11位数字,通常以特定号段开头。常见号段包括:
- 移动:134、135、136、137、138、139、147、150、151、152、157、158、159、172、178、182、183、184、187、188、198
- 联通:130、131、132、145、155、156、166、171、175、176、185、186
- 电信:133、149、153、173、177、180、181、189、199
- 虚拟运营商:170、171
正则表达式校验方法
使用正则表达式进行简单校验:
javascript
function isPhoneNumber(phone) {
return /^1[3-9]\d{9}$/.test(phone);
}
更精确的号段校验:
javascript
function isPhoneNumberStrict(phone) {
return /^1(3[0-9]|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/.test(phone);
}
分段校验方法
如果需要更精确的校验,可以将号段拆分为数组:
javascript
const segments = [
// 移动
'134','135','136','137','138','139','147','150','151','152',
'157','158','159','172','178','182','183','184','187','188','198',
// 联通
'130','131','132','145','155','156','166','171','175','176','185','186',
// 电信
'133','149','153','173','177','180','181','189','199'
];
function isPhoneNumberSegment(phone) {
if (!/^1\d{10}$/.test(phone)) return false;
return segments.includes(phone.substring(0, 3));
}
国际化考虑
对于国际手机号校验,可以使用更通用的正则表达式:
javascript
function isInternationalPhone(phone) {
return /^\+?[1-9]\d{1,14}$/.test(phone);
}
实际应用建议
在实际项目中,建议:
- 前端进行简单格式校验
- 后端进行更严格的校验
- 通过短信验证码进行最终验证
前端完整校验示例:
javascript
function validatePhone(phone) {
const cleaned = phone.replace(/\D/g, '');
if (!/^1\d{10}$/.test(cleaned)) return false;
const segment = cleaned.substring(0, 3);
const segments = [
'130','131','132','133','134','135','136','137','138','139',
'145','147','149','150','151','152','153','155','156','157',
'158','159','166','170','171','172','173','175','176','177',
'178','180','181','182','183','184','185','186','187','188',
'189','198','199'
];
return segments.includes(segment);
}