⾝份证号正则校验(js校验+JAVA校验)js校验⾝份证号【15位和18位】
[javascript] view plaincopyprint?
function scCard(){
var ElementById("sc_card_type").value;
if(scType=="1"){
var ElementById("sc_card_num").value;
if(scCard.length!=0){
if(!checkCard(scCard)){
$("#errorTips").html("⾝份证号码格式错误");
}else{
$("#errorTips").html("");
}
}
}
return false;
}
//function checkidno(obj) {
var vcity={ 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:"澳门",91:"国外"
};
checkCard = function(obj)
{
//var card = ElementById('card_no').value;
正则匹配身份证//是否为空
// if(card === '')
// {
//    return false;
//}
//校验长度,类型
if(isCardNo(obj) === false)
{
return false;
}
//检查省份
if(checkProvince(obj) === false)
{
return false;
}
//校验⽣⽇
if(checkBirthday(obj) === false)
{
return false;
}
//检验位的检测
if(checkParity(obj) === false)
{
return false;
}
return true;
};
//检查号码是否符合规范,包括长度,类型
isCardNo = function(obj)
{
//⾝份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后⼀位是校验位,可能为数字或字符X
var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
st(obj) === false)
{
return false;
}
return true;
};
//取⾝份证前两位,校验省份
checkProvince = function(obj)
var province = obj.substr(0,2);
if(vcity[province] == undefined)
{
return false;
}
return true;
};
//检查⽣⽇是否正确
checkBirthday = function(obj)
{
var len = obj.length;
//⾝份证15位时,次序为省(3位)市(3位)年(2位)⽉(2位)⽇(2位)校验位(3位),皆为数字
if(len == '15')
{
var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
var arr_data = obj.match(re_fifteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date('19'+year+'/'+month+'/'+day);
return verifyBirthday('19'+year,month,day,birthday);
}
//⾝份证18位时,次序为省(3位)市(3位)年(4位)⽉(2位)⽇(2位)校验位(4位),校验位末尾可能为X          if(len == '18')
{
var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
var arr_data = obj.match(re_eighteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date(year+'/'+month+'/'+day);
return verifyBirthday(year,month,day,birthday);
}
return false;
};
//校验⽇期
verifyBirthday = function(year,month,day,birthday)
{
var now = new Date();
var now_year = FullYear();
//年⽉⽇是否合理
FullYear() == year && (Month() + 1) == month && Date() == day)
{
//判断年份的范围(3岁到100岁之间)
var time = now_year - year;
if(time >= 0 && time <= 130)
{
return true;
}
return false;
}
return false;
};
//校验位的检测
checkParity = function(obj)
{
//15位转18位
obj = changeFivteenToEighteen(obj);
var len = obj.length;
if(len == '18')
{
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var cardTemp = 0, i, valnum;
for(i = 0; i < 17; i ++)
{
cardTemp += obj.substr(i, 1) * arrInt[i];
}
valnum = arrCh[cardTemp % 11];
if (valnum == obj.substr(17, 1))
{
return true;
}
return false;
}
return false;
};
/
/15位转18位⾝份证号
changeFivteenToEighteen = function(obj)
if(obj.length == '15')
{
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var cardTemp = 0, i;
obj = obj.substr(0, 6) + '19' + obj.substr(6, obj.length - 6);
for(i = 0; i < 17; i ++)
{
cardTemp += obj.substr(i, 1) * arrInt[i];
}
obj += arrCh[cardTemp % 11];
return obj;
}
return obj;
};
JAVA校验
package com.ebiz.base.utils;
SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import Matcher;
import Pattern;
import com.sts.BaseConst;
import com.sts.ConfigConst;
import com.sts.ExceptionConst;
import com.ebiz.framework.util.date.DateUtil;
import com.ebiz.framework.util.date.DateValidate;
import com.ebiz.framework.util.validate.ValidateUtil;
import com.ebiz.persistence.laputa.FndPageRule;
import com.hp.hpl.sparta.ParseException;
public class CheckIdentificationUtil {
public static void main(String[] args)  {
System.out.println(idCardValidate("370802*********"));
}
/**功能 18位⾝份证的校验
* @param idStr
* @return  ParseException  1001
* @throws Exception
* @throws ParseException
* @throws NumberFormatException
* @ParseException
* @author wangming
*/
public static  String idCardValidate(String idStr)    {
if (idStr == null || (  idStr.length() != 15 && idStr.length() != 18  )) {
return BaseConst.PUBLIC_RESPONSE_FAIL;
}
if(  idStr.length() == 15 ){
StringBuilder sb = new StringBuilder();
sb.append(idStr.substring(0, 6))
.append("19")
.append(idStr.substring(6));
try {
sb.append(String()));
idStr = sb.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(sb);
}
String errorInfo = "";// 记录错误信息
//取模映射
String[] valCodeArr = { "1", "0", "X", "9", "8", "7", "6", "5", "4","3", "2" };
//加权
String[] wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7","9", "10", "5", "8", "4", "2" };  String ai =idStr.substring(0, 17);
if (ValidateUtil.isDigit(ai) == false) {
errorInfo = ExceptionConst.PAXINFO_CARD_ISNOTNUM;
return errorInfo;
}
// ================ 出⽣年⽉是否有效 ================
String strYear = ai.substring(6, 10);// 年份
String strMonth = ai.substring(10, 12);// ⽉份
String strDay = ai.substring(12, 14);// ⽉份
if (DateValidate.isStrDate(ai.substring(6,14))== false) {
errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
//"⾝份证⽣⽇⽆效。";
return errorInfo;
}
GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
Date IntervalDate(new Date(),DateUtil.BEFORE, "150Y");
Date dd = null;
try {
dd = s.parse(strYear + "-" + strMonth + "-" + strDay);
} catch (ParseException e) {//类型转换异常
errorInfo = "ParseException";
return errorInfo;
}
if (DateValidate.isDateBefore(dd,limitDate)) {
errorInfo = ExceptionConst.PAXINFO_CARD_BIRTHDAY_OVER;
//"⾝份证⽣⽇不在有效范围。";
return errorInfo;
}
// ================ 地区码是否有效 ================
if (ConfigConst.CARD_AREA_CODE.indexOf(ai.substring(0, 2))<0) {
errorInfo = ExceptionConst.PAXINFO_CARD_AREA_OVER;
//"⾝份证地区编码错误";
return errorInfo;
}
// ================ 判断最后⼀位的值是否符合校验规则 ================
int totalmulAiWi = 0;
for (int i = 0; i < 17; i++) {
totalmulAiWi = totalmulAiWi+ Integer.parseInt(String.valueOf(ai.charAt(i)))* Integer.parseInt(wi[i]);  }
int modValue = totalmulAiWi % 11;
//映射
String strVerifyCode = valCodeArr[modValue];
ai = ai + strVerifyCode;
//x的校验忽略末尾的⼤⼩写
if (ai.equalsIgnoreCase(idStr) == false) {
errorInfo = ExceptionConst.PAXINFO_CARD_LAST_OVER;
//"⾝份证⽆效,不是合法的⾝份证号码";
return errorInfo;
}
return  BaseConst.PUBLIC_RESPONSE_SUCCESS;
}
/**
* 将已经加上年份的15位⾝份证,按照规则由17位推算出第18位
* @param idCardNumber
* @return
*/
public static char getVerifyCode(String idCardNumber) {
char[] Ai = CharArray();
int[] Wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char[] verifyCode = {'1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int S = 0;
int Y;
for(int i = 0; i < Wi.length; i++){
S += (Ai[i] - '0') * Wi[i];
}
Y = S % 11;
return verifyCode[Y];
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。