验证shenfenzheng合法性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证shenfenzheng合法性相关的知识,希望对你有一定的参考价值。

1.实现代码如下

/**
     * 验证合法性
     */
    function checkIdCard($idcard){
        $City = array(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=>"国外");
        $iSum = 0;
        $idCardLength = strlen($idcard);
        //长度验证
        if(!preg_match(‘/^\d{17}(\d|x)$/i‘,$idcard) and !preg_match(‘/^\d{15}$/i‘,$idcard)){
              return false;
        }
        //地区验证
        if(!array_key_exists(intval(substr($idcard,0,2)),$City)){
             return false;
        }
        // 15位验证生日,转换为18位
        if ($idCardLength == 15){
              $sBirthday = ‘19‘.substr($idcard,6,2).‘-‘.substr($idcard,8,2).‘-‘.substr($idcard,10,2);
              $d = new DateTime($sBirthday);
              $dd = $d->format(‘Y-m-d‘);
              if($sBirthday != $dd){
                  return false;
              }
              $idcard = substr($idcard,0,6)."19".substr($idcard,6,9);//15to18
              $Bit18 = getVerifyBit($idcard);//算出第18位校验码
              $idcard = $idcard.$Bit18;
        }
        // 判断是否大于2078年,小于1900年
        $year = substr($idcard,6,4);
        if ($year<1900 || $year>2078 ){
            return false;
        }
        //18位处理
        $sBirthday = substr($idcard,6,4).‘-‘.substr($idcard,10,2).‘-‘.substr($idcard,12,2);
        $d = new DateTime($sBirthday);
        $dd = $d->format(‘Y-m-d‘);
        if($sBirthday != $dd){
            return false;
        }

        //编码规范验证
        $idcard_base = substr($idcard,0,17);
        if(strtoupper(substr($idcard,17,1)) != $this->getVerifyBit($idcard_base)){
             return false;
        }

        return $idcard;
    }

    // 计算校验码,根据国家标准GB 11643-1999
    function getVerifyBit($idcard_base){
        if(strlen($idcard_base) != 17){
            return false;
        }
        //加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        //校验码对应值
        $verify_number_list = array(‘1‘, ‘0‘, ‘X‘, ‘9‘, ‘8‘, ‘7‘, ‘6‘, ‘5‘, ‘4‘,‘3‘, ‘2‘);
        $checksum = 0;
        for ($i = 0; $i < strlen($idcard_base); $i++){
            $checksum += substr($idcard_base, $i, 1) * $factor[$i];
        }
        $mod = $checksum % 11;
        $verify_number = $verify_number_list[$mod];
        
        return $verify_number;
    }


本文出自 “素颜” 博客,请务必保留此出处http://suyanzhu.blog.51cto.com/8050189/1939076

以上是关于验证shenfenzheng合法性的主要内容,如果未能解决你的问题,请参考以下文章

对shenfenzheng号进行掩码处理

php-对shenfenzheng进行掩码处理

验证toml配置文件合法性

IIS SSL取消证书合法性验证

验证客户端合法性

验证登陆信息的合法性