加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

维易PHP高级身份证号验证类

发布时间:2020-12-13 02:00:14 所属栏目:PHP教程 来源:网络整理
导读:《编程之家高级身份证号验证类》要点: 本文介绍了编程之家高级身份证号验证类,希望对您有用。如果有疑问,可以联系我们。 相关主题:PHP开发/PHP安全 这个编程之家身份证号验证类对身份证进行了更严格的验证。但还不是最强的,最强的就是有一些网站,如阿

《编程之家高级身份证号验证类》要点:
本文介绍了编程之家高级身份证号验证类,希望对您有用。如果有疑问,可以联系我们。

相关主题:PHP开发 / PHP安全

这个编程之家身份证号验证类对身份证进行了更严格的验证。但还不是最强的,最强的就是有一些网站,如阿里云API,通过调用API身份证接口,可以查到公安系统是否登记过。以及身份证号和姓名是否一致。


不过,普通使用场合,这个php类就够用了。

比如现在很多微商分销授权登记,需要身份证号,一般都是真实的,但也不需要金融级别那么严格,这时就需要强化验证一下就行了,本类就可以派上用场。

另外,如果需要前端javascript身份证验证类,查看这里:http://www.52php.cn/jiaocheng/6.html


一、PHP身份证验证类用法:


header("content-type:text/html;charset=utf-8");
$num = '350322199001282536';
$sex = 1;   // 1为男,2为女,不输入为不验证
$test = new check();
$data = $test ->checkIdentity($num,$sex);  //$sex是否男性或女性
//$data = $test ->checkIdentity($num);
var_dump($data);


二、PHP身份证号验证类代码:

<?php

/**
 *  编程之家身份证验证
 * Class idCardCheck
 *  http://www.52php.cn 编程之家培训
 */
class idCardCheck
{
        /**
         * $num 为身份证号码,
         * $checkSex:1为男,2为女,不输入为不验证
         **/
        public function checkIdentity($num,$checkSex=''){
                // 不是15位或不是18位都是无效身份证号
                if(strlen($num) != 15 && strlen($num) != 18){
                        return false;
                }
                // 是数值
                if(is_numeric($num)){
                        // 如果是15位身份证号
                        if(strlen($num) == 15 ){
                                // 省市县(6位)
                                $areaNum = substr($num,6);
                                // 出生年月(6位)
                                $dateNum = substr($num,6,6);
                                // 性别(3位)
                                $sexNum = substr($num,12,3);
                        }else{
                                // 如果是18位身份证号
                                // 省市县(6位)
                                $areaNum = substr($num,6);
                                // 出生年月(8位)
                                $dateNum = substr($num,8);
                                // 性别(3位)
                                $sexNum = substr($num,14,3);
                                // 校验码(1位)
                                $endNum = substr($num,17,1);
                        }
                }else{
                        // 不是数值
                        if(strlen($num) == 15){
                                return false;
                        }else{
                                // 验证前17位为数值,且18位为字符x
                                $check17 = substr($num,17);
                                if(!is_numeric($check17)){
                                        return false;
                                }
                                // 省市县(6位)
                                $areaNum = substr($num,1);

                                if($endNum != 'x' && $endNum != 'X'){
                                        return false;
                                }
                        }
                }

                if(isset($areaNum)){
                        if(!$this ->checkArea($areaNum)){
                                return false;
                        }
                }

                if(isset($dateNum)){
                        if(!$this ->checkDate($dateNum)){
                                return false;
                        }
                }

                // 性别1为男,2为女
                if($checkSex == 1){
                        if(isset($sexNum)){
                                if(!$this ->checkSex($sexNum)){
                                        return false;
                                }
                        }
                }else if($checkSex == 2){
                        if(isset($sexNum)){
                                if($this ->checkSex($sexNum)){
                                        return false;
                                }
                        }
                }

                if(isset($endNum)){
                        if(!$this ->checkEnd($endNum,$num)){
                                return false;
                        }
                }
                return true;
        }

        // 验证城市
        private function checkArea($area){
                $num1 = substr($area,2);
                $num2 = substr($area,2,2);
                $num3 = substr($area,4,2);
                // 根据GB/T2260—999,省市代码11到65
                if(10 < $num1 && $num1 < 66){
                        return true;
                }else{
                        return false;
                }
                //============
                // 对市 区进行验证
                //============
        }

        // 验证出生日期
        private function checkDate($date){
                if(strlen($date) == 6){
                        $date1 = substr($date,2);
                        $date2 = substr($date,2);
                        $date3 = substr($date,2);
                        $statusY = $this ->checkY('19'.$date1);
                }else{
                        $date1 = substr($date,4);
                        $date2 = substr($date,2);
                        $nowY = date("Y",time());
                        if(1900 < $date1 && $date1 <= $nowY){
                                $statusY = $this ->checkY($date1);
                        }else{
                                return false;
                        }
                }
                if(0<$date2 && $date2 <13){
                        if($date2 == 2){
                                // 润年
                                if($statusY){
                                        if(0 < $date3 && $date3 <= 29){
                                                return true;
                                        }else{
                                                return false;
                                        }
                                }else{
                                        // 平年
                                        if(0 < $date3 && $date3 <= 28){
                                                return true;
                                        }else{
                                                return false;
                                        }
                                }
                        }else{
                                $maxDateNum = $this ->getDateNum($date2);
                                if(0<$date3 && $date3 <=$maxDateNum){
                                        return true;
                                }else{
                                        return false;
                                }
                        }
                }else{
                        return false;
                }
        }

        // 验证性别
        private function checkSex($sex){
                if($sex % 2 == 0){
                        return false;
                }else{
                        return true;
                }
        }

        // 验证18位身份证最后一位:$end最后一位,$num身份证号
        private function checkEnd($end,$num){
                $checkHou = array(1,'x',9,8,7,5,3,2);
                $checkGu = array(7,10,1,2);
                $sum = 0;
                for($i = 0;$i < 17; $i++){
                        $sum += (int)$checkGu[$i] * (int)$num[$i];
                }
                $checkHouParameter= $sum % 11;
                if(strtolower($checkHou[$checkHouParameter] )!= strtolower($num[17])){
                        return false;
                }else{
                        return true;
                }
        }

        // 验证平年润年,参数年份,返回 true为润年  false为平年
        private function checkY($Y){
                if(getType($Y) == 'string'){
                        $Y = (int)$Y;
                }
                if($Y % 100 == 0){
                        if($Y % 400 == 0){
                                return true;
                        }else{
                                return false;
                        }
                }else if($Y % 4 ==  0){
                        return true;
                }else{
                        return false;
                }
        }

        // 当月天数 参数月份(不包括2月)  返回天数
        private function getDateNum($month){
                if($month == 1 || $month == 3 || $month == 5 || $month == 7 || $month == 8 || $month == 10 || $month == 12){
                        return 31;
                }else if($month == 2){
                }else{
                        return 30;
                }
        }

}


附:身份证号组成规则知识:

新的18位身份证号码各位的含义:

1-2位省、自治区、直辖市代码;    11-65

3-4位地级市、盟、自治州代码;

5-6位县、县级市、区代码;

7-14位出生年月日,比如19670401代表1967年4月1日;

15-17位为顺序号,其中17位男为单数,女为双数;

18位为校验码,0-9和X,由公式随机产生。

举例:

130503 19670401 0012这个身份证号的含义: 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001,2为验证码。



15位身份证号码各位的含义:

1-2位省、自治区、直辖市代码;

3-4位地级市、盟、自治州代码;

5-6位县、县级市、区代码;

7-12位出生年月日,比如670401代表1967年4月1日,这是和18位号码的第一个区别;

13-15位为顺序号,其中15位男为单数,女为双数;

与18位身份证号的第二个区别:没有最后一位的验证码。

举例:

130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出生日期为1967年4月1日,顺序号为001。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读