PHP验证身份证格式

/**
* 验证身份证基本格式
* @param $idcard
* @return bool
*/
public static function validateIdcard($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'
);
 
// 身份证不是17+xX或18位数字或15位数字
if (!preg_match('/^([d]{14,18}[xXd]|[d]{15})$/', $idcard)) {
return false;
}
// 身份证城市不在列表中
if (!in_array(substr($idcard, 0, 2), $City)) {
return false;
}
$idcard = preg_replace('/[xX]$/i', 'a', $idcard);
$length = strlen($idcard);
if ($length == 18) {
$vBirthday = substr($idcard, 6, 4) . '-' . substr($idcard, 10, 2) . '-' . substr($idcard, 12, 2);
} else {
$vBirthday = '19' . substr($idcard, 6, 2) . '-' . substr($idcard, 8, 2) . '-' . substr($idcard, 10, 2);
}
// 生日验证,并且如果生日大于现在的时间,也报错
$birthdayTime = strtotime($vBirthday);
if (date('Y-m-d', $birthdayTime) != $vBirthday && $birthdayTime > time()) {
return false;
}
return true;
}
原文地址:https://www.cnblogs.com/linzy/p/7654686.html