身份證號碼驗證方法
阿新 • • 發佈:2018-12-29
<?php //** =======================身份證號碼驗證方法(start)======================= */ //正則匹配=====['required','regex:/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/'] function validation_filter_id_card($id_card){ //如果身份證長度18 if(strlen($id_card)==18){ return idcard_checksum18($id_card); }elseif((strlen($id_card)==15)){ $id_card=idcard_15to18($id_card); return idcard_checksum18($id_card); }else{ return false; } } // 計算身份證校驗碼,根據國家標準GB 11643-1999 function idcard_verify_number($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; } // 將15位身份證升級到18位 function idcard_15to18($idcard){ if(strlen($idcard)!=15){ return false; }else{ // 如果身份證順序碼是996 997 998 999,這些是為百歲以上老人的特殊編碼 if(array_search(substr($idcard,12,3),array('996','997','998','999')) !== false){ $idcard=substr($idcard,0,6).'18'.substr($idcard,6,9); }else{ $idcard=substr($idcard,0,6).'19'.substr($idcard,6,9); } } $idcard=$idcard.idcard_verify_number($idcard); return $idcard; } // 18位身份證校驗碼有效性檢查 function idcard_checksum18($idcard){ if(strlen($idcard)!=18){ return false; } $idcard_base=substr($idcard,0,17);//獲取身份證的前17位 if(idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){ return false; }else{ return true; } } /** =======================身份證號碼驗證方法(end)======================= */ //物件轉陣列 function ota($obj){ return json_decode(json_encode($obj),true); } /** * 檔案大小格式化 * @param integer $size 初始檔案大小,單位為byte * @return array 格式化後的檔案大小和單位陣列,單位為byte、KB、MB、GB、TB */ function file_size_format($size = 0, $dec = 2) { $unit = array("B", "KB", "MB", "GB", "TB", "PB"); $pos = 0; while ($size >= 1024) { $size /= 1024; $pos++; } $result['size'] = round($size, $dec); $result['size'] = sprintf("%.2f", $result['size']); $result['unit'] = $unit[$pos]; return $result['size'].$result['unit']; }