http://hi.baidu.com/showecn/blog/i ... 0a77a40eaf8f859.html
符合GB11643-1999标准的PHP身份证号码检查程序2008-04-06 19:45<?php /*/ # CopyRight: zxing # Document: 检查符合 GB11643-1999 标准的身份证号码的正确性 # File:gb11643_1999.func.php Fri Mar 28 09:42:41 CST 2008 zxing # Updated:Fri Mar 28 09:42:41 CST 2008 # Note: 调用函数 check_id(); #/*/// $id =array(); $id[] = '370882198601064774'; $id[] = '420502198611281126'; $id[] = '370882198601064770'; $id[] = '370882860106477'; $id[] = '63212519850703214x'; $id[] = '429021198203221006'; $id[] = '429036198203211023'; foreach ($id as $key => $value){ echo check_id($value)?$value.' 是真的!<br/>': $value.' 是假的!<br/>'; } #/*/ /*/ # 函数功能:计算身份证号码中的检校码 # 函数名称:idcard_verify_number # 参数表 :string $idcard_base 身份证号码的前十七位 # 返回值 :string 检校码 # 更新时间:Fri Mar 28 09:50:19 CST 2008 /*/ 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); //debug 加权因子 $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); //debug 校验码对应值 $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位 # 函数名称:idcard_15to18 # 参数表 :string $idcard 十五位身份证号码 # 返回值 :string # 更新时间:Fri Mar 28 09:49:13 CST 2008 /*/ 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位身份证校验码有效性检查 # 函数名称:idcard_checksum18 # 参数表 :string $idcard 十八位身份证号码 # 返回值 :bool # 更新时间:Fri Mar 28 09:48:36 CST 2008 /*/ function idcard_checksum18($idcard){ if (strlen($idcard) != 18){ return false; } $idcard_base = substr($idcard, 0, 17); if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))){ return false; }else{ return true; } } /*/ # 函数功能:身份证号码检查接口函数 # 函数名称:check_id # 参数表 :string $idcard 身份证号码 # 返回值 :bool 是否正确 # 更新时间:Fri Mar 28 09:47:43 CST 2008 /*/ function check_id($idcard) { if(strlen($idcard) == 15 || strlen($idcard) == 18){ if(strlen($idcard) == 15){ $idcard = idcard_15to18($idcard); } if(idcard_checksum18($idcard)){ return true; }else{ return false; } }else{ return false; } } ?>
|