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