PHP身份证查询代码

2 篇文章 0 订阅
1 篇文章 0 订阅

该代码可以实现身份证的查询,准确性如何就不得而知了,还可以判断是否是一个正确(指逻辑正确)的号码。

示例见http://www.ickd.cn/sfz/

<?php
function IDCheck($e){
	$arrVerifyCode = explode(",","1,0,x,9,8,7,6,5,4,3,2");
	$Wi = explode(",","7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2");
	$Checker = explode(",","1,9,8,7,6,5,4,3,2,1,1");

	$len=strlen($e);
	if($len!==15 && $len!==18)return false;

	if($len == 18){
		$ai = substr($e, 0, 17);
	}elseIf($len == 15){
		$ai = $e;
		$ai = substr($ai, 0,6) . "19" . substr($ai, 6, 9);
	}

	//If(Not IsNumeric($ai))return false;

	$strYear = substr($ai, 7, 4);
	$strMonth = substr($ai, 11, 2);
	$strDay = substr($ai, 13, 2);
	if(checkdate($strMonth,$strDay,$strYear ))return false;

	for($i = 0;$i<17;$i++){	
		$TotalmulAiWi += substr($ai, $i, 1)*$Wi[$i];
	}
	$modValue = $TotalmulAiWi % 11;
	$strVerifyCode = $arrVerifyCode[$modValue];
	
	$ai .= $strVerifyCode;
//	If(strlen($e) == 18 && $e <> $ai)return false;
	return $ai;
}

function getRegion($id){
	$info=file('./info.txt');
	$regions=array();
	foreach($info as $line){
		list($region_code,$addr)=explode('|',$line);
		$regions[$region_code]=trim($addr);
	}
	$adr=substr($id,0,6);
	if($adr{5}=='0'){
		return '身份证号码错误';
	}
	$prov=$city=$county='';
	$prov=$regions[substr($id,0,2).'0000'];
	$city=$regions[substr($id,0,4).'00'];
	$county=$regions[substr($id,0,6)];
	if(!$city || !$prov || !$county){
		return '身份证号码错误';
	}
	if($city==$prov){
		return sprintf('%s-%s',$prov,$county);
	}else{
		return sprintf('%s-%s-%s',$prov,$city,$county);
	}
}
function  getGender($idc){
	$idclen=strlen($idc);
	if(15 == $idclen){
 		if(0 <> $idc[$idclen-1]%2){
 	 		return "男";
		}else{
   			return "女";
		}
	}elseif(18 == $idclen){
 		if(0 <> $idc[$idclen-2]%2){
 	 		return "男";
		}else{
   			return "女";
		}
	}  	
}
function  getBirthday($idc){
	$idclen=strlen($idc);
	if(15 == $idclen){
		preg_match('/^\d{6}(\d{2})(\d{2})(\d{2})\d{3}$/',$idc,$a);
		$y='19'.$a[1];
		$m=$a[2];
		$d=$a[3];
	}elseif(18 == $idclen){
		preg_match('/^\d{6}(\d{4})(\d{2})(\d{2})\d{3}[\dxX]$/',$idc,$a);
		$y=$a[1];
		$m=$a[2];
		$d=$a[3];
	}else{
		$y=$m=$d=0;
	}
	return sprintf('%s年%s月%s日',$y,$m,$d);
}
function getIDInfo($id){
	$idc=IDCheck($id);
	if($idc){
		$json=array(
			'InputID'=>$id,
			'OutputID'=>$idc,
			'Birthday'=>getBirthday($idc),
			'Gender'=>getGender($idc),
			'Address'=>getRegion($idc),
			'Error'=>'',
			'Warning'=>''
		);
		if($idc!==$id){
			$json['Warning']='ID错误';
		}
	}else{
		$json=array(
			'InputID'=>$id,
			'OutputID'=>'',
			'Birthday'=>'',
			'Gender'=>'',
			'Address'=>'',
			'Error'=>'ID错误',
			'Warning'=>''
		);
	}
	return $json;
}
	$id=strtolower(trim($_GET['id']));
	if(!preg_match('/^\d{15}(\d{2}[\dx]?)?$/',$id)){
		$json=array(
			'InputID'=>$id,
			'OutputID'=>'',
			'Birthday'=>'',
			'Gender'=>'',
			'Address'=>'',
			'Error'=>'ID错误',
			'Warning'=>''
		);
	}else{
		$json=getIDInfo($id);
	}
	echo json_encode($json);
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值