身份证号码 15位和18位 验证

首先先了解 身份证号码的编码规则,从百度经验上找到了别人的分享

:http://jingyan.baidu.com/article/7f41ececff944a593d095c8c.html

感谢。

15位长度的验证正则是从网上找的,但发现并不是万能的(月份可以出现00,日期可以出现00等),

所以做了如下改良,但仍旧存在一些问题,如880231这样的生日也可以验证功过

所以可以考虑将身份证号码的年月日单独判断,在此略去。

18位长度的就按校验规则来校验即可。

function chkIdNo($idNo)
{
    //身份证正则表达式(15位)
    //isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
    ////身份证正则表达式(18位)
    //isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
    $len = strlen($idNo); 

    //十五位身份证1999 10 01不再办理
    if($len == 15) {
        //13 04 03 991001 002
        //$pattern = ‘/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{2}[Xx0-9]$/‘;
        //修复 月份 天 不能同时为00
        $pattern = ‘/^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\d)|3[0-1])\d{2}[Xx0-9]$/‘;
        $res = preg_match($pattern, $idNo);
        if($res) return true;
        return false;
    }
    if($len == 18){
        //前17位对应的权重数字算法 (2<<($len - 2 - n)%11 

        $bits = str_split($idNo);
        //每位对应的权重数字
        $weights = array();
        //求和
        $sum = 0;
        for($i = 0; $i < 17; $i++) {
            //计算权重
            $weights[$i] = (2 << ($len - 2 - $i)) % 11;
            $sum += $bits[$i] * $weights[$i];
        }

        $mod = $sum % 11;
        //校验码array(1, 0, ‘X‘, 9, 8, 7, 6, 5, 4, 3, 2);
        $chkCodes = array(1, 0, ‘X‘, 9, 8, 7, 6, 5, 4, 3, 2);
        $code = isset($chkCodes[$mod]) ? $chkCodes[$mod].‘‘ : ‘‘;
        if($code !== $bits[$len - 1]) {
            return false;
        }

        return true;
    }
    return false;
}

  

时间: 2024-08-11 04:51:34

身份证号码 15位和18位 验证的相关文章

做一个牛XX的身份证号验证类(支持15位和18位)

原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 15) str = CidUpdate(str); if (str.Length == 18) { string strResult = CheckCidInfo(str); if (strResult == "非法地区" || strResult == "非法生日" |

简单的关于身份证(15位或者18位)合法性验证

package com.clark.test.idcard; /** * 测试校验身份证合法性的小程序 * <p>我们常用的身份证号码为18位或者15位</p> <p>下面的程序仅仅用于校验18为的身份证的合法性</p> * @author caolipeng * @date 2015年1月9日 上午10:27:13 * @Version 1.0 */ public class IDCardValidator { <span style="c

身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X

function checkIdCardNo(idCardNo) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if (reg.test(idCardNo) === false) { wx.showToast({ title: '身份证号码不正确!', icon: 'none', }) return false; }

java中身份证号15位转18位

/** * 将15位转换为18位 * @param idCode 15位身份证号 * @return String 18位身份证号 */ public String toEighteen(String idCode) { idCode = idCode.substring(0, 6) + "19" + idCode.substring(6);//加入年份,变成17位 //计算校验位 begin char[] Ai = idCode.toCharArray(); int[] Wi = {

php提取身份证号码中的生日日期以及验证是否为未成年人的函数

php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位和18位身份证 function getIDCardInfo($IDCard){ $result['error']=0;//0:未知错误,1:身份证格式错误,2:无错误 $result['flag']='';//0标示成年,1标示未成年 $result['tdate']='';//生日,格式如:2012-

C# 身份证号码15位和18位验证

/// <summary> /// 身份证 /// </summary> [Serializable] public class IDCard {     /// <summary>     /// 身份证号     /// </summary>     public string IDCardNum { get; set; }     /// <summary>     /// 行政区     /// </summary>     

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

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

身份证号码15位转18位 C#实现

[身份证最后一位神秘X的由来]身份证中的“冷知识”1999年的今天,<国务院关于实行公民身份号码制度的决定>被发布,当年10月1日实施.为什么有的有X?这位数是根据前17位计算出的校验码.如某人尾号是0-9,不会有X,如是10,则用X代替.Ⅹ是罗马数字的10,这能保证身份证号不多位. /// <summary> /// 转换15位身份证号码为18位 /// </summary> /// <param name="oldIDCard">15

身份证15位转18位

create or replace function changeaac002_15to18( ls_card varchar2)return varchar2 is ls_newcard varchar2(18);a1 number(10);a2 number(10);a3 number(10);a4 number(10);a5 number(10);a6 number(10);a7 number(10);a8 number(10);a9 number(10);a10 number(10);a