php下对中国内地身份证进行验证

//验证身份证是否有效
	public function check_idcard($idcard) {
		if(preg_match('`^[0-9a-zA-Z\(\)]+$`', $idcard)){//基本格式
			//return true;
			if (strlen($idcard) == 18) {
				check18IDCard($idcard); //18位身份证校验码有效性检查
			} elseif ((strlen($idcard) == 15)) {
				$idcard= convertIDCard15to18($idcard);// 将15位身份证升级到18位
				check18IDCard($idcard);//18位身份证校验码有效性检查
			} else {
                return false;
			}
		}else{
		    return false;
		}
	}

//计算身份证的最后一位验证码,根据国家标准GB 11643-1999
	public function calcIDCardCode($idcardBody) {
		if (strlen($idcardBody) != 17) {
			return false;
		}
		//加权因子
		$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
		//校验码对应值
		$code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
		$checksum = 0;
		for ($i = 0; $i < strlen($idcardBody); $i++) {
			$checksum += substr($idcardBody, $i, 1) * $factor[$i];
		}
		return $code[$checksum % 11];
	}

// 18位身份证校验码有效性检查
	public function check18IDCard($idcard) {
		if (strlen($idcard) != 18) {
			return false;
		}
		
		$idcardBody = substr($idcard, 0, 17); //身份证主体
		$idcardCode = strtoupper(substr($idcard, 17, 1)); //身份证最后一位的验证码
		
		if (calcIDCardCode($idcardBody) != $idcardCode) {
			return false;
		} else {
			return true;
		}
	}

// 将15位身份证升级到18位
	public function convertIDCard15to18($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. self::calcIDCardCode($idcard);
		return $idcard;
	}

猜你喜欢

转载自blog.csdn.net/qq_32837111/article/details/106905088