在 PHP 中,验证中国身份证号码的有效性是一个常见需求。身份证号码通常为 15 位或 18 位。以下是验证身份证号码的详细步骤和示例代码。
1. 身份证号码的基本规则
- 15 位身份证:由 15 位数字组成,通常是老旧的身份证格式。
- 18 位身份证:由 17 位数字和 1 位校验码组成,校验码可以是数字或字母 X(表示 10)。
校验规则
- 长度检查:身份证号码必须是 15 位或 18 位。
- 数字格式检查:身份证号码的前 17 位必须是数字,最后一位可以是 X。
- 地区码检查:前 6 位是地区码,必须是有效的地区编码。
- 出生日期检查:需要检查身份证中包含的出生日期是否有效。
- 校验位计算(仅适用于 18 位身份证)。
2. 示例代码
以下是一个验证身份证号码的 PHP 函数示例:
<?php
function isValidIdCard($idCard) { $idCard = trim($idCard); if (strlen($idCard) != 15 && strlen($idCard) != 18) { return false; }
if (strlen($idCard) == 15) { if (!preg_match('/^\d{15}$/', $idCard)) { return false; } } else { if (!preg_match('/^\d{17}[\dX]$/i', $idCard)) { return false; } if (!checkIdCardChecksum($idCard)) { return false; } }
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. 注意事项
- 确保输入的身份证号码是字符串类型,并去除两端空格。
- 处理身份证号码时要注意数据安全和隐私保护。