身份证号验证
身份证号验证和生成网站: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 }