手机号码验证是个蛋疼的问题, 根据维基百科的介绍.
中国内地手机卡号以 1 开头,共 11 位数,前 7 位数字通常称为手机号段。手机号段类似于地区电话区号,但又不完全相同。2010 年 11 月之前,一般可以从手机号段直接区分城市归属地和运营商。
示例:1XX-YYYY-ZZZZ
第 1~3 位数表示电信运营商。
第 4~7 位数表示地区号码 (YYYY)。
第 8~11 位数表示客户号码 (ZZZZ)。
验证地区号码跟客户号码应该没必要, 我们只要匹配匹配前三位要符合范围就好. 并且我们只需要让 “公众移动通信网网号段” 的号码段通过即可, 不需要支持 “物联网业务专用号段”.
范围就不多描述了, 直接上代码吧.
由于三大运营商都新增加了新的号码段, 对正则做一下更新:
中国移动有在卖 147 的号码段…
<?php
function verify($phoneNumber)
{
if (0 === preg_match('/^(13\d|147|15[012356789]|166|17[01235678]|18\d|19[89])\d{8}$/', $phoneNumber)) {
return false;
}
if ('13800138000' === $phoneNumber || 0 < preg_match('/^(\d)\g{1}{7}$/', substr($phoneNumber, 3))) {
return false;
}
return true;
}
var_dump(verify('13800138000'));
var_dump(verify('13411011211'));