您的位置:首页 > 编程语言 > PHP开发

PHP身份证验证

2017-12-23 00:00 85 查看
//身份证验证方法(开始)--------------------------------------------------------------------------------------
/*使用方法
$isTrue = Object::checkIdCard("33078219930718081X");
if($isTrue){
$Json = '{ "RS":"是合法身份证" }'; //成功返回1
$Json = Object::PC_ReturnConversion($Json);
echo $Json;
}else{
$Json = '{ "RS":"此身份证非法" }'; //成功返回1
$Json = Object::PC_ReturnConversion($Json);
echo $Json;
}
exit();
*/
/**
* 验证身份证号码的合法性
* @param string $idcard  用于验证身份证的号码
* @return boolean 如果身份证号码合法,返回true,如果不合法,返回false
* */
static function checkIdCard($idcard){
if(empty($idcard)){ return false; }
$City = array(
11=>"北京",12=>"天津",13=>"河北",14=>"山西",15=>"内蒙古",21=>"辽宁",22=>"吉林",
23=>"黑龙江",31=>"上海",32=>"江苏",33=>"浙江",34=>"安徽",35=>"福建",36=>"江西",
37=>"山东",41=>"河南",42=>"湖北",43=>"湖南",44=>"广东",45=>"广西",46=>"海南",
50=>"重庆",51=>"四川",52=>"贵州",53=>"云南",54=>"西藏",61=>"陕西",62=>"甘肃",
63=>"青海",64=>"宁夏",65=>"新疆",71=>"台湾",81=>"香港",82=>"澳门",91=>"国外"
);

$iSum = 0;
$idCardLength = strlen($idcard);

//长度验证
if(!preg_match('/^\d{17}(\d|x)$/i',$idcard) and!preg_match('/^\d{15}$/i',$idcard)){
return false;
}

//地区验证
if(!array_key_exists(intval(substr($idcard,0,2)),$City)){
return false;
}
//15位身份证验证生日,转换为18位
if ($idCardLength == 15){
$sBirthday = '19'.substr($idcard,6,2).'-'.substr($idcard,8,2).'-'.substr($idcard,10,2);
//echo $sBirthday; die;
try {
$d = new \DateTime($sBirthday);
}catch (Exception $e){
return false;
}
$dd = $d->format('Y-m-d');
if($sBirthday != $dd){
return false;
}
$idcard = substr($idcard,0,6)."19".substr($idcard,6,9);//15to18
$Bit18 = getVerifyBit($idcard);//算出第18位校验码
$idcard = $idcard.$Bit18;
}
//判断是否大于2078年,小于1900年
$year = substr($idcard,6,4);
if ($year<1900 || $year>2078){ return false; }

//18位身份证处理
$sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2);
try {
$d = new \DateTime($sBirthday);
}catch (Exception $e){
return false;
}
$dd = $d->format('Y-m-d');
if($sBirthday != $dd){ return false; }

//身份证编码规范验证
$idcard_base = substr($idcard,0,17);
if(strtoupper(substr($idcard,17,1)) !=getVerifyBit($idcard_base)){ return false; }
return true;
}

//计算身份证校验码,根据国家标准GB 11643-1999
static function getVerifyBit($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;
}
//身份证验证方法(结束)--------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: