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;
}
}
}