插件窝 干货文章 php如何用正则表达式只匹配身份证

php如何用正则表达式只匹配身份证

身份证 校验 号码 验证 988    来源:    2025-03-18

在PHP中,可以使用正则表达式来匹配身份证号码。中国大陆的身份证号码通常为18位数字,最后一位可能是数字或字母X(用于表示10)。以下是一个正则表达式,用于匹配符合中国大陆身份证格式的字符串:

$pattern = '/^\d{17}[\dXx]$/';

这个正则表达式的含义如下: - ^ 表示字符串的开始。 - \d{17} 表示匹配17位数字。 - [\dXx] 表示最后一位可以是数字或字母X(大小写不敏感)。 - $ 表示字符串的结束。

你可以使用preg_match函数来检查一个字符串是否符合这个正则表达式:

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

if (preg_match($pattern, $id_card)) {
    echo "身份证号码格式正确。";
} else {
    echo "身份证号码格式不正确。";
}

更严格的身份证验证

如果你需要更严格的验证,比如检查身份证号码的校验位是否正确,可以使用更复杂的算法。以下是一个简单的校验位验证示例:

function validateIdCard($id_card) {
    // 基本格式验证
    if (!preg_match('/^\d{17}[\dXx]$/', $id_card)) {
        return false;
    }

    // 校验位计算
    $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 += $id_card[$i] * $weights[$i];
    }

    $mod = $sum % 11;
    $checkCode = $checkCodes[$mod];

    return strtoupper($id_card[17]) == $checkCode;
}

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

if (validateIdCard($id_card)) {
    echo "身份证号码格式正确且校验位验证通过。";
} else {
    echo "身份证号码格式不正确或校验位验证失败。";
}

这个函数不仅验证身份证号码的格式,还验证校验位是否正确。校验位的计算是基于前17位数字和特定的权重进行的。

注意事项

  • 这个正则表达式和校验位验证仅适用于中国大陆的身份证号码。
  • 如果你需要验证其他地区的身份证号码,可能需要使用不同的正则表达式和校验算法。

希望这些信息对你有帮助!