Karp 的技术博客

在 PHP 中,验证中国身份证号码的有效性是一个常见需求。身份证号码通常为 15 位或 18 位。以下是验证身份证号码的详细步骤和示例代码。

1. 身份证号码的基本规则

  • 15 位身份证:由 15 位数字组成,通常是老旧的身份证格式。
  • 18 位身份证:由 17 位数字和 1 位校验码组成,校验码可以是数字或字母 X(表示 10)。

校验规则

  1. 长度检查:身份证号码必须是 15 位或 18 位。
  2. 数字格式检查:身份证号码的前 17 位必须是数字,最后一位可以是 X。
  3. 地区码检查:前 6 位是地区码,必须是有效的地区编码。
  4. 出生日期检查:需要检查身份证中包含的出生日期是否有效。
  5. 校验位计算(仅适用于 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. 注意事项

  • 确保输入的身份证号码是字符串类型,并去除两端空格。
  • 处理身份证号码时要注意数据安全和隐私保护。

php

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年10月21日 06:15
0

目录

来自 《PHP 身份证号码验证方法》
774 文章数
0 评论量
9 分类数
779 页面数
已在风雨中度过 9年277天3小时44分