插件窝 干货文章 PHP正则表达式实现精准匹配身份证号码 - IT工程师实战教程

PHP正则表达式实现精准匹配身份证号码 - IT工程师实战教程

PHP正则表达式实现精准匹配身份证号码

在Web开发中,身份证号码的验证是一个常见需求。本文将详细介绍如何使用PHP正则表达式实现精准的身份证号码匹配验证。

一、身份证号码格式规则

中国大陆身份证号码由18位组成,各部分的含义如下:

  • 前6位:地区代码
  • 7-14位:出生日期(YYYYMMDD格式)
  • 15-17位:顺序码
  • 第18位:校验码(0-9或X)

二、PHP正则表达式实现

以下是完整的PHP身份证号码验证函数:

function validateIdCard($idCard) {
    // 18位身份证正则表达式
    $pattern = '/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]$/';
    
    if (!preg_match($pattern, $idCard)) {
        return false;
    }
    
    // 校验码验证
    $idCard = strtoupper($idCard);
    $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    $verifyList = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    $sum = 0;
    
    for ($i = 0; $i < 17; $i++) {
        $sum += $idCard[$i] * $factor[$i];
    }
    
    $mod = $sum % 11;
    
    return $idCard[17] == $verifyList[$mod];
}

三、正则表达式解析

让我们分解这个正则表达式:

  • ^[1-9]\d{5} - 匹配前6位地区码,第一位1-9,后5位数字
  • (18|19|20)\d{2} - 匹配年份(1800-2099)
  • (0[1-9]|1[0-2]) - 匹配月份(01-12)
  • (0[1-9]|[12]\d|3[01]) - 匹配日期(01-31)
  • \d{3} - 匹配顺序码
  • [0-9Xx]$ - 匹配最后一位校验码(0-9或X)

四、使用示例

$idCard = '11010519491231002X';
if (validateIdCard($idCard)) {
    echo '身份证号码有效';
} else {
    echo '身份证号码无效';
}

五、注意事项

  1. 此正则仅验证格式,不验证地区代码是否真实存在
  2. 15位旧身份证号码已停用,建议只验证18位格式
  3. 实际应用中应结合其他验证方式
  4. 敏感信息处理需遵守相关法律法规

通过本文介绍的PHP正则表达式方法,您可以轻松实现身份证号码的精准匹配验证,提高Web表单的数据质量。