【PHP】身份证正则验证、校验位验证

目录

1.正则

简单正则

详细正则

2.校验位验证


1.正则


  • 简单正则
function isValidIdCardNumber($idCardNumber) {
    // 身份证号长度为 15 位或 18 位
    $pattern = '/^(?:\d{15}|\d{17}[\dxX])$/';
    return preg_match($pattern, $idCardNumber);
}

$idCardNumber = '123456789012345678'; // 示例身份证号

if (isValidIdCardNumber($idCardNumber)) {
    echo '身份证号有效';
} else {
    echo '身份证号无效';
}

这个正则表达式会匹配 15 位数字的身份证号(例如:123456789012345)或 18 位数字加一个校验位(例如:123456789012345678X123456789012345678x)的身份证号。请注意,这个正则表达式并不会验证校验位是否正确,只会检查身份证号的长度和格式。

  • 详细正则
$idcard = '123456789012345678';
$idcard = strtoupper($idcard); // 转成大写
$reg = '/^[1-9]\d{5}(19|20|21)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/';
if (!preg_match($reg, $idcard)) {
    return false;
}
return true;

这个正则表达式用于验证中国大陆的身份证号。它的结构如下:

  1. /^:表示正则表达式的开始。
  2. [1-9]:第一位必须是 1-9 之间的数字。
  3. \d{5}:接下来的 5 位是任意数字。
  4. (19|20|21):接下来的 2 位可以是 "19"、"20" 或 "21" 之间的数字。
  5. \d{2}:接下来的 2 位是任意数字。
  6. ((0[1-9])|(10|11|12)):接下来的 2 位表示月份,可以是 "01" 到 "09" 或 "10" 到 "12" 之间的数字。
  7. (([0-2][1-9])|10|20|30|31):接下来的 2 位表示日期,可以是 "01" 到 "29" 之间的数字,或者 "30" 到 "31" 之间的数字(根据月份和闰年的不同而变化)。
  8. \d{3}:接下来的 3 位是任意数字。
  9. [0-9Xx]:最后一位可以是数字 0-9 或字母 X(大小写均可)。
  10. $:表示正则表达式的结束。

这个正则表达式用于验证身份证号的格式是否正确。然而,它并不会验证校验位是否正确。

2.校验位验证


 以下是一个使用 PHP 验证中国大陆身份证号校验位是否正确的示例:

function isValidIdCardNumber($idCardNumber) {
    // 身份证号长度为 15 位或 18 位
    $pattern = '/^(?:\d{15}|\d{17}[\dxX])$/';
    if (!preg_match($pattern, $idCardNumber)) {
        return false;
    }

    // 15 位身份证号转换为 18 位
    if (strlen($idCardNumber) === 15) {
        $idCardNumber = substr($idCardNumber, 0, 6) . '19' . substr($idCardNumber, 6, 9);
    }

    // 计算校验位
    $weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    $checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    $sum = 0;
    for ($i = 0; $i < 17; $i++) {
        $sum += $weights[$i] * (int) $idCardNumber[$i];
    }
    $checkCodeIndex = $sum % 11;

    // 验证校验位
    $lastChar = strtoupper($idCardNumber[17]);
    return $lastChar === $checkCodes[$checkCodeIndex];
}

$idCardNumber = '123456789012345678'; // 示例身份证号

if (isValidIdCardNumber($idCardNumber)) {
    echo '身份证号有效';
} else {
    echo '身份证号无效';
}

这个示例首先使用正则表达式验证身份证号的格式。如果身份证号格式正确,它会继续计算校验位。如果校验位与身份证号中的最后一位字符相符,那么身份证号被认为是有效的。

相关推荐

  1. PHP身份证验证校验验证

    2023-12-19 20:54:03       61 阅读
  2. 【python】邮箱验证

    2023-12-19 20:54:03       25 阅读
  3. jQuery 表达式 验证表单

    2023-12-19 20:54:03       52 阅读
  4. PHP函数实现验证身份证号码并提取年龄

    2023-12-19 20:54:03       59 阅读
  5. c# 身份证信息验证

    2023-12-19 20:54:03       23 阅读
  6. 22.2 表达式-数据验证、数据变换

    2023-12-19 20:54:03       26 阅读
  7. HTML5 Input 验证身份证

    2023-12-19 20:54:03       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-19 20:54:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-19 20:54:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-19 20:54:03       82 阅读
  4. Python语言-面向对象

    2023-12-19 20:54:03       91 阅读

热门阅读

  1. 考研英语语法(十九)

    2023-12-19 20:54:03       47 阅读
  2. Android Studio Gradle构建很慢,下载依赖缓慢问题

    2023-12-19 20:54:03       59 阅读
  3. 如何做到页面实时刷新

    2023-12-19 20:54:03       52 阅读
  4. ubuntu vscode 设置Maple font字体

    2023-12-19 20:54:03       72 阅读
  5. ubuntu22安装python3虚拟环境

    2023-12-19 20:54:03       48 阅读
  6. uni-app基本标签

    2023-12-19 20:54:03       56 阅读
  7. Python基础-字符串

    2023-12-19 20:54:03       49 阅读
  8. 【MySQL】MySQL的执行计划

    2023-12-19 20:54:03       54 阅读
  9. pip使用

    2023-12-19 20:54:03       53 阅读