PHP/JS 检查身份证号码的有效性

先上PHP版本的

/**
     * 检测身份证号码有效性
     * @param $idcard
     * @return boolean
    */
    function check_idcard($idcard){
        //1.利用算法验证
        $pattern = '/^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/'; //身份证正则
        $factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
        $parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
        $code = substr($idcard,17);//取最后一位
        if(!preg_match($pattern,$idcard)){
           return false;
        }
        $sum = 0;
        for($i=0;$i<17;$i++) {
            $sum += $idcard{$i}*$factor[$i];
        }
        if($parity[$sum % 11] != strtoupper($code)) {
            return false;
        }
        //2.验证日期有效
        $date = substr($idcard,6,8);
        $pattern = '/^(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/';
        if(!preg_match($pattern,$date)){
            return false;
        }
        //检查这个日期是否有效
        $year = date('Y',strtotime($date));
        $month = date('m',strtotime($date));
        $day = date('d',strtotime($date));
        if(!checkdate($month,$day,$year)){
            return false;
        }
        //3.检查省份
        $pattern = '/^[1-9][0-9]/';
        $provs = [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=>"澳门"];
        $pro = substr($idcard,0,2);
        if(!preg_match($pattern,$pro)){
            return false;
        }
        if(!isset($provs[$pro]) || !$provs[$pro]){
            return false;
        }
        return true;
    }

下面是JS版本的

/**
* 检测身份证号码有效性
* @param idcard 身份证号
* @return boolean
*/
function check_idcard(idcard){
    //1.利用算法验证
    var pattern = /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
    var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
    var code = idcard.substring(17);
    if(!pattern.test(idcard)) {
        return false;
    }
    var sum = 0;
    for(var i=0;i<17;i++) {
        sum += idcard[i]*factor[i];
    }
    if(parity[sum % 11] != code.toUpperCase()) {
        return false;
    }
    //2.验证日期有效性
    var date = idcard.substring(6,14);
    var pattern = /^(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
    if(!pattern.test(date)) {
        return false;
    }
    var year = date.substring(0, 4);
    var month = date.substring(4, 6);
    var date = date.substring(6, 8);
    var date2 = new Date(year+"-"+month+"-"+date);
    if(!date2 || date2.getMonth() != (parseInt(month) - 1)) {
        return false;
    }
    //3.检测省份
    var pattern = /^[1-9][0-9]/;
    var provs = {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:"澳门"};
    var pro = idcard.substring(0,2);
    if(!pattern.test(pro)) {
        return false;
    }
    if(!provs[pro]) {
        return false;
    }
    return true;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值