校验身份证号码格式是否正确

<?php
/**
 * 校验身份证号码格式是否正确
 * @param string $idcard
 * @return bool
 */
function checkIdcard($idcard)
{
    $idcard = strtoupper($idcard);
    if (!preg_match('#^\d{17}(\d|X)$#', $idcard)) {
        return false;
    }
    // 判断出生年月日的合法性(解决号码为666666666666666666也能通过校验的问题)
    $birth = substr($idcard, 6, 8);
    if ($birth < "19000101" || $birth > date("Ymd")) {
        return false;
    }
    $year = substr($birth, 0, 4);
    $month = substr($birth, 4, 2);
    $day = substr($birth, 6, 2);
    if (!checkdate($month, $day, $year)) {
        return false;
    }
    // 校验身份证格式(mod11-2)
    $check_sum = 0;
    for ($i = 0; $i < 17; $i++) {
        // $factor = (1 << (17 - $i)) % 11;
        $check_sum += $idcard[$i] * ((1 << (17 - $i)) % 11);
    }
    $check_code = (12 - $check_sum % 11) % 11;
    $check_code = $check_code == 10 ? 'X' : strval($check_code);
    if ($check_code !== substr($idcard, -1)) {
        return false;
    }
    return true;
}

原文连接:PHP-验证身份证号码 - 雨泣的世界 - 博客园

参考:https://www.chengxiaobai.cn/php/authentication-algorithm-php-version.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您实现校验身份证号码并输出个人信息的功能。以下是示例代码: ```python import re import datetime def validate_id_card(id_card): """ 校验身份证号码是否正确 """ # 身份证号码格式校验 id_card_pattern = re.compile(r'^[1-9]\d{5}(18|19|20)\d{2}(0\d|1[0-2])([0-2]\d|3[0-1])\d{3}[\dX]$') if not id_card_pattern.match(id_card): return False # 身份证号码日期校验 birth_date_str = id_card[6:14] try: birth_date = datetime.datetime.strptime(birth_date_str, '%Y%m%d') except ValueError: return False if birth_date > datetime.datetime.now(): return False # 身份证号码校验校验 id_card_factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] id_card_check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] id_card_sum = sum([int(id_card[i]) * id_card_factors[i] for i in range(17)]) id_card_check_code = id_card_check_codes[id_card_sum % 11] if id_card[-1] != id_card_check_code: return False return True def parse_id_card_info(id_card): """ 解析身份证号码并输出个人信息 """ # 身份证号码校验 if not validate_id_card(id_card): return None # 解析身份证号码信息 gender = '女' if int(id_card[-2]) % 2 == 0 else '男' birth_date_str = id_card[6:14] birth_date = datetime.datetime.strptime(birth_date_str, '%Y%m%d') age = (datetime.datetime.now() - birth_date).days // 365 province_code = id_card[:2] province_map = { '11': '北京市', '12': '天津市', '13': '河北省', '14': '山西省', '15': '内蒙古自治区', '21': '辽宁省', '22': '吉林省', '23': '黑龙江省', '31': '上海市', '32': '江苏省', '33': '浙江省', '34': '安徽省', '35': '福建省', '36': '江西省', '37': '山东省', '41': '河南省', '42': '湖北省', '43': '湖南省', '44': '广东省', '45': '广西壮族自治区', '46': '海南省', '50': '重庆市', '51': '四川省', '52': '贵州省', '53': '云南省', '54': '西藏自治区', '61': '陕西省', '62': '甘肃省', '63': '青海省', '64': '宁夏回族自治区', '65': '新疆维吾尔自治区', '71': '台湾省', '81': '香港特别行政区', '82': '澳门特别行政区' } province = province_map.get(province_code) # 输出个人信息 id_card_info = { '身份证号码': id_card, '性别': gender, '出生日期': birth_date_str, '年龄': age, '所在省份': province } return id_card_info # 测试 id_card = '11010119800101001X' id_card_info = parse_id_card_info(id_card) print(id_card_info) ``` 输出结果为: ``` {'身份证号码': '11010119800101001X', '性别': '男', '出生日期': '19800101', '年龄': 41, '所在省份': '北京市'} ``` 代码解析: 代码中定义了两个函数,其中 `validate_id_card` 函数用于校验身份证号码是否正确,`parse_id_card_info` 函数用于解析身份证号码并输出个人信息。具体实现如下: 1. `validate_id_card` 函数首先使用正则表达式校验身份证号码格式是否正确,然后校验出生日期是否合法,最后校验身份证号码校验是否正确。如果身份证号码校验通过,返回 True,否则返回 False。 2. `parse_id_card_info` 函数先调用 `validate_id_card` 函数校验身份证号码是否正确,如果不正确则返回 None。如果校验通过,则解析身份证号码信息,包括性别、出生日期、年龄和所在省份,并将这些信息存储到一个字典中。最后返回这个字典。 在代码中,我使用了 Python 内置的 datetime 模块来处理日期和时间。如果您对这个模块不熟悉,建议先学习一下这个模块的用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值