首页 > 编程语言 >php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用

php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用

时间:2023-06-04 19:13:17浏览次数:55  
标签:15 1999 18 IDCard substr 身份证 return false

校验函数

//验证身份证是否有效
function validateIDCard($IDCard) {
    if (strlen($IDCard) == 18) {
        return check18IDCard($IDCard);
    } elseif ((strlen($IDCard) == 15)) {
        $IDCard = convertIDCard15to18($IDCard);
        return check18IDCard($IDCard);
    } else {
        return false;
    }
}

//计算身份证的最后一位验证码,根据国家标准GB 11643-1999
function calcIDCardCode($IDCardBody) {
    if (strlen($IDCardBody) != 17) {
        return false;
    }

    //加权因子 
    $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    //校验码对应值 
    $code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
    $checksum = 0;

    for ($i = 0; $i < strlen($IDCardBody); $i++) {
        $checksum += substr($IDCardBody, $i, 1) * $factor[$i];
    }

    return $code[$checksum % 11];
}

// 将15位身份证升级到18位 
function convertIDCard15to18($IDCard) {
    if (strlen($IDCard) != 15) {
        return false;
    } else {
        // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 
        if (array_search(substr($IDCard, 12, 3), array('996', '997', '998', '999')) !== false) {
            $IDCard = substr($IDCard, 0, 6) . '18' . substr($IDCard, 6, 9);
        } else {
            $IDCard = substr($IDCard, 0, 6) . '19' . substr($IDCard, 6, 9);
        }
    }
    $IDCard = $IDCard . calcIDCardCode($IDCard);
    return $IDCard;
}

// 18位身份证校验码有效性检查 
function check18IDCard($IDCard) {
    if (strlen($IDCard) != 18) {
        return false;
    }

    $IDCardBody = substr($IDCard, 0, 17); //身份证主体
    $IDCardCode = strtoupper(substr($IDCard, 17, 1)); //身份证最后一位的验证码

    if (calcIDCardCode($IDCardBody) != $IDCardCode) {
        return false;
    } else {
        return true;
    }
}

使用方法

//使用方法
validateIDCard('身份证');

标签:15,1999,18,IDCard,substr,身份证,return,false
From: https://www.cnblogs.com/cn-oldboy/p/17456120.html

相关文章

  • 【学习笔记】(18) 长链剖分
    长链剖分1.算法简介与性质长链剖分本质上就是另外一种链剖分方式。长链剖分与重链剖分有相通之处,后者是将子树大小最大的儿子作为重儿子,前者则是将子树深度最大的儿子作为重儿子。可见两者只是换了一个剖分形式。长链剖分有如下性质:性质1:每个节点所在长链末端为其子树......
  • Leetcode 1156. 单字符重复子串的最大长度
    题目:如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。难度:中等示例1:输入:text="ababa"输出:3示例2:输入:text="aaabaaa"输出......
  • 2018WEB安全测试秋季预选赛WriteUp
    0x01input传送门:http://114.55.36.69:8003/题目上说前三道题目是容易的,于是就从容易的题目入手,为了拿到1血,手速飞快地点,emmm,一紧张忘了js输出语句怎么写了,百度后才发现,自己有多蠢alert啊!进入网址,发现一个输入框,查看源码,发现id="flag",后面有一段js代码<script>functionchec......
  • 159.342 操作系统和网络
    159.342-OperatingSystemsandNetworksAssignment#3(dueon11/Jun)MemoryManagementUsingtheBuddySystemStrategyOBJECTIVE:ThemainobjectiveinthisassignmentistoimplementtheBuddySystemmemorymanagementstrategybywritingtwofunctionsthat......
  • 1839D - Ball Sorting (dp)
    题意:有一个1~n的序列,求放k个0后,最小操作次数,使得去掉0后序列升序,每次操作;可以把与0相邻的数,放到任意位置思路:因为n最大到500,并且求k属于1~n的所有最小代价,所以考虑dpdp[i][j],i表示以ai结尾放j个0的最小代价最小代价等于去掉以ai结尾升序列后,剩余子段用j个区间覆盖,的最小值......
  • ABC215E 题解
    前言题目传送门!更好的阅读体验?萌萌DP题。思路题目就是在说从\(a\)里面按顺序掏出来一些字母,使得相同的字母都是相邻的(比如AABBBBCD可行,AAABBCAA不行)。看起来很不可做,突破口在于\(\text{A}\sim\text{J}\)一共只有\(10\)个字母,考虑状压。设\(dp_{i,s}\)表示......
  • CF1808E3 题解
    题意传送门求有多少包含\(n\)位数码的\(k\)进制数,满足存在一位数等于其他\(n-1\)位数的总和模\(k\)。\(1\len\le10^{18},1\lek\le2000\)。题解简单的组合数学都不会了……蔬菜越来越多,我该怎么办?条件等价于存在某一位\(x\),满足\(2x\equivs\pmodk\)。容易想到......
  • 15-触摸按键控制LED灯
    1.触摸按键触摸按键可分为四大类:电阻式,电容式,红外感应式和表面声波式电阻式触摸按键使用人体破压电阻,改变电阻,实现开关效果,耐用性差,很少使用红外感应式是通过红外扫描的方式,一般使用在比较恶劣的环境当中表面声波式主要通过声波扫描的方式进行识别按键是否被按下,主......
  • 算法刷题记录:[NOIP1999]回文数
    题目链接https://ac.nowcoder.com/acm/contest/19859/G题目分析高精度相加+进制转换+判断回文的模拟题。AC代码//Problem:[NOIP1999]回文数//Contest:NowCoder//URL:https://ac.nowcoder.com/acm/contest/19859/G//MemoryLimit:262144MB//TimeLimit:20......
  • 尺寸扩充!触想智能二代全系产品解锁18.5寸黄金比例
    触想智能于近日完成了针对二代嵌入式全系产品线的升级动作——新增18.5寸16:9比例显示屏规格。升级完成后,触想二代产品线已全面覆盖7寸-23.8寸范围内共17款主流标准尺寸,为客户配套应用提供更多选择。  口碑佳作二代嵌入式系列是触想智能面向工业显......