//获取手机区号
public static function getPhoneQuhao($phoneStr, $myQuhao='') {
$phoneStr = trim($phoneStr);
$quhao = $myQuhao;
$phone = $phoneStr;
//去掉非数字
$removeNoNumber = function ($str) {
return preg_replace('/\D/', '', $str);
};
//从区号库中匹配手机的区号 从大到小检测
$getQuhaoFromAllDb = function ($str, $quhaoKu=[]) {
$str = trim($str);
if(!$quhaoKu) {
$allQuhao = '3491,1876,1869,1868,1809,1787,1784,1767,1758,1684,1671,1670,1664,1649,1473,1441,1345,1340,1284,1268,';
$allQuhao .= '1264,1246,1242,998,996,995,994,993,992,977,976,975,974,973,972,971,970,968,967,966,965,964,963,962,';
$allQuhao .= '961,960,886,883,880,856,855,853,852,850,692,691,689,688,687,685,680,679,676,673,599,598,597,596,595,';
$allQuhao .= '594,593,592,591,590,509,508,507,506,505,504,503,502,501,423,421,420,389,387,386,385,382,381,380,379,378,';
$allQuhao .= '377,376,375,374,373,372,371,370,359,358,357,356,355,354,353,352,351,350,299,298,297,291,269,268,267,266,';
$allQuhao .= '265,264,262,261,260,258,257,256,255,254,253,252,251,250,249,248,247,244,243,242,241,240,238,237,236,235,';
$allQuhao .= '234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,218,216,213,212,98,95,94,93,92,91,90,84,82,81,';
$allQuhao .= '66,65,64,63,62,61,60,58,57,56,55,54,52,51,49,48,47,46,45,44,43,41,40,39,36,34,33,32,31,30,27,20,7';
$allQuhaoArray = explode(',', $allQuhao);
} else {
$allQuhaoArray = $quhaoKu;
}
foreach ($allQuhaoArray as $tmpQuhao) {
$quhaoLen = strlen($tmpQuhao);
if(substr($str, 0, $quhaoLen) == $tmpQuhao) {
$phone = substr($str, $quhaoLen);
return [$tmpQuhao, $phone];
}
}
return ['', $str];
};
//正则去除
//+n 1234567890
if(preg_match('/(^\+[0-9]+)\s+/', $phoneStr)) {
preg_match_all('/(^\+[0-9]+)\s+(.+)/', $phoneStr, $out);
$quhao = $removeNoNumber($out[1][0]);
$phone = $removeNoNumber($out[2][0]);
} elseif(preg_match('/(^\+[0-9]+)-/', $phoneStr)) {
//+n-1234567890
preg_match_all('/(^\+[0-9]+)-(.+)/', $phoneStr, $out);
$quhao = $removeNoNumber($out[1][0]);
$phone = $removeNoNumber($out[2][0]);
} elseif(preg_match('/(^\+[0-9]+)\(/', $phoneStr)) {
//+n(123)4567890
preg_match_all('/(^\+[0-9]+)\((.+)/', $phoneStr, $out);
$quhao = $removeNoNumber($out[1][0]);
$phone = $removeNoNumber($out[2][0]);
} elseif(preg_match('/(^\+[0-9]+)/', $phoneStr)) {
//+1231234567890
//解析美国号码 +0011234567890
if(preg_match('/^\+001([0-9-]{10}$)/', $phoneStr)) {
$quhao = '1';
$phone = substr($phoneStr, 4);
} elseif(preg_match('/^\+1([0-9-]{10}$)/', $phoneStr)) {
$quhao = '1';
$phone = substr($phoneStr, 2);
} elseif (preg_match('/(^\+86)([0-9-]{11}$)/', $phoneStr)) {
//解析中国号码 +8612345678901
$quhao = '86';
$phone = substr($phoneStr, 3);
} else {
//从库中匹配其他号码 +122412345678901
$result = $getQuhaoFromAllDb(ltrim($phoneStr, '+'));
if($result[0]) $quhao = $result[0];
$phone = $result[1];
}
} else {
//纯数字开头
if(preg_match('/(^[0-9-])/', $phoneStr)) {
//提供自己的区号 则拿自己区号去匹配
if($myQuhao) {
$result = $getQuhaoFromAllDb($phoneStr, [$myQuhao]);
if($result[0]) $quhao = $result[0];
$phone = $result[1];
$phone = $removeNoNumber($phone);
}
}
//去掉括号,空格
$phone = $removeNoNumber($phone);
}
return [$quhao, $phone];
}