身份证号验证

身份证号验证和生成网站:http://sfz.diqibu.com/

 
  1 <?php
  2 
  3 /**
  4  * 身份证号码验证类 - 度娘
  5  */
  6 
  7 class Idcard
  8 {
  9     /**
 10      * 根据身份证判断,是否满足年龄条件
 11      * @param type $id_card 身份证
 12      * @param type $min_age 最小年龄
 13      */
 14     public function isMeetAgeByIDCard($id_card, $min_age) {
 15         $ret = $this->validateIDCard($id_card);
 16         if ($ret === FALSE) {
 17             return FALSE;
 18         }
 19 
 20         if (strlen($id_card) <= 15) {
 21             $id_card = $this->convertIDCard15to18($id_card);
 22         }
 23 
 24         $year = date('Y') - substr($id_card, 6, 4);
 25         $month_day = date('md') - substr($id_card, 10, 4);
 26 
 27         return ($year > $min_age || $year == $min_age && $month_day > 0) ? TRUE : FALSE;
 28     }
 29 
 30     /**
 31      * 身份证号验证
 32      * @param 身份证号
 33      * @return bool
 34      */
 35     public function validateIDCard($id_card)
 36     {
 37         if (strlen($id_card) == 18) {
 38             return $this->check18IDCard($id_card);
 39         } elseif ((strlen($id_card) == 15)) {
 40             $id_card = $this->convertIDCard15to18($id_card);
 41             return $this->check18IDCard($id_card);
 42         } else {
 43             return false;
 44         }
 45     }
 46 
 47     /**
 48      * 根据身份证号获取相关信息
 49      * @param 身份证号
 50      * @return bool
 51      */
 52     public function getIDCardInfo($id_card)
 53     {
 54         if (strlen($id_card) == 18) {
 55 
 56         } elseif ((strlen($id_card) == 15)) {
 57             $id_card = $this->convertIDCard15to18($id_card);
 58         } else {
 59             return array();
 60         }
 61         $return_data = array(
 62             'birthday' => substr($id_card, 6, 4) . '-' . substr($id_card, 10, 2) . '-' . substr($id_card, 12, 2),
 63             'sex'      => (substr($id_card, -2, 1)%2) == 0 ? 0 : 1,
 64             'card_code'=> $id_card
 65         );
 66         return $return_data;
 67     }
 68 
 69     /**
 70      *  计算身份证校验码,根据国家标准GB 11643-1999
 71      *  @param string $IDCard 身份证
 72      */
 73     private function calcIDCardCode($idcard_base)
 74     {
 75         if (strlen($idcard_base) != 17) {
 76             return false;
 77         }
 78         //加权因子
 79         $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 80         //校验码对应值
 81         $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
 82         $checksum = 0;
 83         for ($i = 0; $i < strlen($idcard_base); $i++) {
 84             $checksum += substr($idcard_base, $i, 1) * $factor[$i];
 85         }
 86         $mod = $checksum % 11;
 87         $verify_number = $verify_number_list[$mod];
 88         return $verify_number;
 89     }
 90 
 91     /**
 92      *  将15位身份证升级到18位
 93      *  @param string $IDCard 身份证
 94      */
 95     private function convertIDCard15to18($idcard)
 96     {
 97         if (strlen($idcard) != 15) {
 98             return false;
 99         } else {
100             // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
101             if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false) {
102                 $idcard = substr($idcard, 0, 6) . '18' . substr($idcard, 6, 9);
103             } else {
104                 $idcard = substr($idcard, 0, 6) . '19' . substr($idcard, 6, 9);
105             }
106         }
107         $idcard = $idcard . $this->calcIDCardCode($idcard);
108         return $idcard;
109     }
110 
111     /**
112      *  18位身份证校验码有效性检查
113      *  @param string $IDCard 身份证
114      */
115     private function check18IDCard($idcard)
116     {
117         if (strlen($idcard) != 18) {
118             return false;
119         }
120         $idcard_base = substr($idcard, 0, 17);
121         if ($this->calcIDCardCode($idcard_base) != strtoupper(substr($idcard, 17, 1))) {
122             return false;
123         } else {
124             return true;
125         }
126     }
127 
128     /**
129      * 银行卡校验
130      * @param $card_number
131      * @return string
132      */
133     public function checkBankCard($card_number){
134         if(!$card_number){
135             return false;
136         }
137         $arr_no = str_split($card_number);
138         $last_n = $arr_no[count($arr_no)-1];
139         krsort($arr_no);
140         $i = 1;
141         $total = 0;
142         foreach ($arr_no as $n){
143             if($i%2==0){
144                 $ix = $n*2;
145                 if($ix>=10){
146                     $nx = 1 + ($ix % 10);
147                     $total += $nx;
148                 }else{
149                     $total += $ix;
150                 }
151             }else{
152                 $total += $n;
153             }
154             $i++;
155         }
156         $total -= $last_n;
157         $x = 10 - ($total % 10);
158         if($x == $last_n){
159             return true;
160         }else{
161             return false;
162         }
163     }
164 }

 

posted on 2019-06-21 10:14  年华消逝青春  阅读(439)  评论(0编辑  收藏  举报

导航