Graent.Hu 的博客

新浪微薄腾讯微薄

最新碎语:最近感觉有些迷茫,怎么办~

您的位置:Graent.Hu 的博客 >PHP编程> php正则验证18位二代身份证号码的方法

php正则验证18位二代身份证号码的方法

timg.jpg


function ckId($value){
        $city = [11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西",
            15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江 ", 31 => "上海",
            32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西",
            37 => "山东", 41 => "河南", 42 => "湖北 ", 43 => "湖南", 44 => "广东",
            45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州",
            53 => "云南", 54 => "西藏 ", 61 => "陕西", 62 => "甘肃", 63 => "青海",
            64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外"
        ];

        $row = true;
        if (!preg_match('/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/', $value, $rst)) {
            $row = false;
        } elseif (!$city[substr($value, 0, 2)]) {
            $row = false;
        } else {
            $value = str_split($value);
            //∑(ai×Wi)(mod 11)
            //加权因子
            $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            //校验位
            $parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
            $sum = 0;
            $ai = 0;
            $wi = 0;
            for ($i = 0; $i < 17; $i++) {
                $ai = $value[$i];
                $wi = $factor[$i];
                $sum += $ai * $wi;
            }
            if ($parity[$sum % 11] != strtoupper($value[17])) {
                $row = false;
            }
        }
        return $row;
    }

使用方法直接调用即可:


ckID('123456789123456789');


我的微信:graent_hu

欢迎扫码加我和微信好友,有什么问题我们可以一起探讨,有什么需要也随时欢迎发消息给我~

转载请注明出处:

本文标题:php正则验证18位二代身份证号码的方法

本文链接:https://www.wlyc.cn/post-119.html

发表评论

路人甲 表情
看不清楚?点图切换