方法片段:PHP正则识别字符串中的中国手机号

Author Avatar
云璃 2019年06月20日

简介

本方法片段只支持识别中国国内手机号,暂不支持识别国际手机号

各国手机号识别可参考 libphonenumber
javascript 版本libphonenumber-js

片段

     /**
     * identifyMobilesInString
     * 识别字符串中的中国手机号
     *
     * @param string $oldStr
     * @return array 
     */
    function identifyMobilesInString($oldStr = "")
    {

        // 检测字符串是否为空
        $oldStr = trim($oldStr);
        $numbers = array();
        if (empty($oldStr)) {
            return $numbers;
        }

        // 删除nationcode-mobile,area code-之类的号码中间的减号(-)
        $strArr = explode("-", $oldStr);
        $newStr = $strArr[0];
        for ($i = 1; $i < count($strArr); $i++) {
            if (preg_match("/\d{2}$/", $newStr) && preg_match("/^\d{11}/", $strArr[$i])) {
                $newStr .= $strArr[$i];
            } elseif (preg_match("/\d{3,4}$/", $newStr) && preg_match("/^\d{7,8}/", $strArr[$i])) {
                $newStr .= $strArr[$i];
            } else {
                $newStr .= "-" . $strArr[$i];
            }
        }

        // 手机号的获取
        $reg = '/\D(?:86)?(\d{11})\D/is'; //匹配数字的正则表达式
        preg_match_all($reg, $newStr, $result);
        $nums = array();
        // * 中国移动:China Mobile
        $cmcc = "/^((((13[4-9])|(14[78])|(15[012789])|(165)|(17[28])|(18[23478])|(198))\d{8})|(170[356]\d{7
  }))$/";
        // * 中国联通:China Unicom
        $unicom = "/^((((13[0-2])|(14[56])|(15[56])|(16[67])|(17[156])|(18[56]))\d{8})|((170[4789])\d{7}))$/";
        // * 中国电信:China Telecom
        $telecom = "/^((((133)|(149)|(153)|(17[37])|(18[019])|(19[19]))\d{8})|(170[0-2]\d{7}))$/";
        //
        foreach ($result[1] as $key => $value) {
            if (preg_match($cmcc, $value)) {
                $nums[] = array("number" => $value, "type" => "中国移动");
            } elseif (preg_match($unicom, $value)) {
                $nums[] = array("number" => $value, "type" => "中国联通");
            } elseif (preg_match($telecom, $value)) {
                $nums[] = array("number" => $value, "type" => "中国电信");
            } else {
                // 非法号码
            }
        }
        $numbers["mobile"] = $nums;

        // 固定电话或小灵通的获取
        $reg = '/\D(0\d{10,12})\D/is'; //匹配数字的正则表达式
        preg_match_all($reg, $newStr, $result);
        $nums = array();
        // * 中国国内固定电话或小灵通
        // * 区号:010,020,021,022,023,024,025,027,028,029
        // * 号码:七位或八位
        $phs = "/^0(10|2[0-5789]|\d{3})\d{7,8}$/";
        foreach ($result[1] as $key => $value) {
            if (preg_match($phs, $value)) {
                $nums[] = array("number" => $value, "type" => "固定电话或小灵通");
            } else {
                // 非法
            }
        }
        $numbers["landline"] = $nums;

        // 有可能是没有区号的固定电话的获取
        $reg = '/\D(\d{7,8})\D/is'; //匹配数字的正则表达式
        preg_match_all($reg, $newStr, $result);
        $nums = array();
        foreach ($result[1] as $key => $value) {
            $nums[] = array("number" => $value, "type" => "没有区号的固定电话");
        }
        $numbers["possible"] = $nums;

        // 返回最终数组
        return $numbers;
    }

本文链接:https://www.masterzc.cn/archives/103.html
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

Title - Artist
0:00