js 与 php 验证身份证

js

var ffutil = {};

(function(o){
	
	o.validation_filter_id_card = function(id_card){
		if(id_card.length == 18){
			return this.idcard_checksum18(id_card);
		}else if(id_card.length == 15){
			id_card = this.idcard_15to18(id_card);
			return this.idcard_checksum18(id_card);
		}else{
			return false;
		}
	};
	
	o.idcard_checksum18 = function(id_card){
		if(id_card.length != 18){
			return false;
		}
		var idcard_base = id_card.substr(0, 17);
		var lastStr = id_card.substr(17,1);
		if(this.idcard_verify_number(idcard_base) != lastStr.toUpperCase() ){
			return false;
		}else{
			return true;
		}
	};
	
	// 将15位身份证升级到18位 
	o.idcard_15to18 = function(id_card){
		if(id_card.length != 15){
			return false;
		}else{
			// 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 
			var arr = ['996','997','998','999'];
			if($.inArray(id_card.substr(12,3), arr) !== false){
				id_card = id_card.substr(0, 6) + '18' + id_card.substr(6, 9);
			}else{
				id_card = id_card.substr(0, 6) + '19' + id_card.substr(6, 9);
			}
		}
		id_card = id_card + this.idcard_verify_number(id_card);
		return id_card;
	};
	
	o.idcard_verify_number = function(idcard_base){
		if(idcard_base.length != 17){
			return false;
		}
		//加权因子 
		var factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
		//校验码对应值 
		var verify_number_list = ['1','0','X','9','8','7','6','5','4','3','2'];
		var checksum = 0;
		for(var i = 0; i < idcard_base.length; i++){
			checksum += parseInt(idcard_base.substr(i,1) * factor[i]);
		}
		var mod = checksum % 11;
		var verify_number = verify_number_list[mod];
		return verify_number;
	};
	
	
	return o;
})(ffutil);

console.log(ffutil.validation_filter_id_card('511101198108101591'));

php

class util{
         /**
   	 * 验证身份证
   	 * @param string $id_card
   	 */
   	public function validation_filter_id_card($id_card){
   	    if(strlen($id_card)==18){
   	        return $this->idcard_checksum18($id_card);
   	    }elseif((strlen($id_card)==15)){
   	        $id_card = $this->idcard_15to18($id_card);
   	        return $this->idcard_checksum18($id_card);
   	    }else{
   	        return false;
   	    }
   	}
   	// 计算身份证校验码,根据国家标准GB 11643-1999
   	private function idcard_verify_number($idcard_base){
   	    if(strlen($idcard_base)!=17){
   	        return false;
   	    }
   	    //加权因子
   	    $factor=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
   	    //校验码对应值
   	    $verify_number_list=array('1','0','X','9','8','7','6','5','4','3','2');
   	    $checksum=0;
   	    for($i=0;$i<strlen($idcard_base);$i++){
   	        $checksum += substr($idcard_base,$i,1) * $factor[$i];
   	    }
   	    //print_r($checksum);
   	    $mod=$checksum % 11;
   	    $verify_number=$verify_number_list[$mod];
   	    return $verify_number;
   	}
   	// 将15位身份证升级到18位
   	private function idcard_15to18($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.$this->idcard_verify_number($idcard);
   	    return $idcard;
   	}
   	// 18位身份证校验码有效性检查
   	private function idcard_checksum18($idcard){
   	    if(strlen($idcard)!=18){
   	        return false;
   	    }
   	    $idcard_base=substr($idcard,0,17);
   	    if($this->idcard_verify_number($idcard_base)!=strtoupper(substr($idcard,17,1))){
   	        return false;
   	    }else{
   	        return true;
   	    }
   	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值