在 PHP 中,验证中国身份证号码的有效性是一个常见需求。身份证号码通常为 15 位或 18 位。以下是验证身份证号码的详细步骤和示例代码。
1. 身份证号码的基本规则
- 15 位身份证:由 15 位数字组成,通常是老旧的身份证格式。
- 18 位身份证:由 17 位数字和 1 位校验码组成,校验码可以是数字或字母 X(表示 10)。
校验规则
- 长度检查:身份证号码必须是 15 位或 18 位。
- 数字格式检查:身份证号码的前 17 位必须是数字,最后一位可以是 X。
- 地区码检查:前 6 位是地区码,必须是有效的地区编码。
- 出生日期检查:需要检查身份证中包含的出生日期是否有效。
- 校验位计算(仅适用于 18 位身份证)。
2. 示例代码
以下是一个验证身份证号码的 PHP 函数示例:
<?php
function isValidIdCard($idCard) {
// 1. 检查长度
$idCard = trim($idCard);
if (strlen($idCard) != 15 && strlen($idCard) != 18) {
return false;
}
// 2. 检查数字格式
if (strlen($idCard) == 15) {
if (!preg_match('/^\d{15}$/', $idCard)) {
return false;
}
} else {
if (!preg_match('/^\d{17}[\dX]$/i', $idCard)) {
return false;
}
// 3. 校验位计算
if (!checkIdCardChecksum($idCard)) {
return false;
}
}
// 4. 检查出生日期
return checkBirthday(substr($idCard, 6, 8));
}
function checkIdCardChecksum($idCard) {
$weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3];
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum += intval($idCard[$i]) * $weights[$i];
}
$checkDigit = (12 - ($sum % 11)) % 11;
$checkDigit = $checkDigit == 10 ? 'X' : $checkDigit;
return strtoupper($idCard[17]) == strtoupper($checkDigit);
}
function checkBirthday($birthday) {
$year = substr($birthday, 0, 4);
$month = substr($birthday, 4, 2);
$day = substr($birthday, 6, 2);
// 检查日期合法性
if (!checkdate($month, $day, $year)) {
return false;
}
// 检查出生日期是否在合理范围内
$birthDate = DateTime::createFromFormat('Ymd', $birthday);
return $birthDate <= new DateTime();
}
// 测试
$idCard = '11010519491231002X'; // 示例身份证号码
if (isValidIdCard($idCard)) {
echo "身份证号码有效。\n";
} else {
echo "身份证号码无效。\n";
}
?>
3. 代码说明
- isValidIdCard:主函数,检查身份证号码的有效性。
- checkIdCardChecksum:计算校验位并与身份证末尾进行比较。
- checkBirthday:检查出生日期的合法性,包括日期范围和格式。
4. 注意事项
- 确保输入的身份证号码是字符串类型,并去除两端空格。
- 处理身份证号码时要注意数据安全和隐私保护。