<?php
function validateIDCard($idCard) {
// 检查长度是否为18位
if (strlen($idCard) != 18) {
return false;
}
// 加权因子
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
// 校验码对应值
$checksum = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
// 计算前17位的加权和
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum += intval(substr($idCard, $i, 1)) * $factor[$i];
}
// 获取校验位
$checkBit = $checksum[$sum % 11];
// 比较最后一位(第18位)是否与计算出的校验位相符
if (strtoupper(substr($idCard, 17, 1)) == $checkBit) {
// 可选:进一步验证日期有效性,这里简单验证格式,更详细的验证需要考虑月份天数等
if (preg_match('/^(\d{4})(\d{2})(\d{2})$/', substr($idCard, 6, 8), $matches) && checkdate($matches[2], $matches[3], $matches[1])) {
return true;
} else {
return false; // 日期无效
}
} else {
return false; // 校验位不符
}
}
// 使用示例
$idCard = "12345678";
if (validateIDCard($idCard)) {
echo "身份证号码有效。";
} else {
echo "身份证号码无效。";
}
身份证验证
于 2024-07-12 15:46:48 首次发布