PHP,通讯录,特殊字符处理,

//获取手机区号
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];

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值