Exemplo n.º 1
0
function checkIdCard($idcard){
    $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("/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}(\d|x|X)$/", $idcard) && !preg_match("/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/", $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);
		$d = new DateTime($sBirthday);
		$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 ($year2078 )
	{
		return false;
	}
	//18位身份证处理
	$sBirthday = substr($idcard,6,4).'-'.substr($idcard,10,2).'-'.substr($idcard,12,2);
	$d = new DateTime($sBirthday);
	$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;
}
Exemplo n.º 2
0
 public 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);
         $d = new DateTime($sBirthday);
         $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);
     $d = new DateTime($sBirthday);
     $dd = $d->format('Y-m-d');
     if ($sBirthday != $dd) {
         return false;
     }
     //身份证编码规范验证
     $idcard_base = substr($idcard, 0, 17);
     if (strtoupper(substr($idcard, 17, 1)) != $this->getVerifyBit($idcard_base)) {
         return false;
     } else {
         return true;
     }
 }