import java.util.Arrays;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IdentityVerificationUtil {
private static String[] 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"};//省份代号
public static boolean nameVerification (String name){
if (name.length()<1) {
return false;
}
String reg= "^(([a-zA-Z+\\.?\\·?a-zA-Z+]{2,30}$)|([\\u4e00-\\u9fa5+\\·?\\u4e00-\\u9fa5+]{2,30}$))";
//判断用户输入的真实姓名是否为空
if(name.length()>20){
return false;
}
if(name.length()==0){
return false;
}
//检测姓名的格式是否匹配
else if(!Pattern.matches(reg,name)){
return false;
}
else {
return true;
}
}
public static boolean phoneVerification (String phone){
if (phone.length()<1) {
return false;
}
String reg= "^1(3|4|5|6|7|8|9)\\d{9}$";
if(!Pattern.matches(reg,phone)){
return false;
} else {
return true;
}
}
public static boolean idCardVerification (String idCard){
if (idCard.length()<1) {
return false;
}
//是否为空
if ("".equals(idCard)) {
return false;
}
//校验长度,类型
String longTypeReg = "(^\\d{15}$)|(^\\d{17}(\\d|X)$)";
if(!Pattern.matches(longTypeReg,idCard)) {
return false;
}
//取身份证前两位,校验省份
String checkProvince = idCard.substring(0,2);
if (!Arrays.asList(vcity).contains(checkProvince)) {
return false;
}
//检查生日是否正确
if (!checkBirthday(idCard)) {
return false;
}
//检验位的检测
if(!checkParity(idCard)) {
return false;
}
return true;
}
public static boolean checkBirthday(String idCard) {
int len = idCard.length();
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if(len == 15)
{
String re_fifteen = "^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$";
Pattern p = Pattern.compile(re_fifteen);
Matcher arr_data = p.matcher(idCard);
while (arr_data.find()) {
int year = Integer.parseInt("19"+arr_data.group(2));
int month = Integer.parseInt(arr_data.group(3));
int day = Integer.parseInt(arr_data.group(4));
Calendar birthday = Calendar.getInstance();
birthday.set(year,month-1,day);
return verifyBirthday(year, month, day, birthday);
}
}
//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
if(len == 18)
{
String re_eighteen = "^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$";
Pattern p = Pattern.compile(re_eighteen);
Matcher arr_data = p.matcher(idCard);
while (arr_data.find()) {
int year = Integer.parseInt(arr_data.group(2));
int month = Integer.parseInt(arr_data.group(3));
int day = Integer.parseInt(arr_data.group(4));
//Date birthday = new Date(year+"/"+month+"/"+day);
Calendar birthday = Calendar.getInstance();
birthday.set(year,month-1,day);
return verifyBirthday(year,month,day,birthday);
}
}
return false;
}
public static boolean verifyBirthday(int year,int month,int day,Calendar birthday){
Calendar now = Calendar.getInstance();
int now_year = now.get(Calendar.YEAR);
// int now_year = now.get(Calendar.MONTH);
// int now_year = now.get(Calendar.DAY_OF_MONTH);
if(birthday.get(Calendar.YEAR) == year && (birthday.get(Calendar.MONTH)+1) == month && birthday.get(Calendar.DAY_OF_MONTH) == day)
{
//判断年份的范围(3岁到100岁之间)
int time = now_year - year;
if(time >= 3 && time <= 100)
{
return true;
}
return false;
}
return false;
}
public static boolean checkParity(String card){
//15位转18位
card = changeFivteenToEighteen(card);
int len = card.length();
if(len == 18)
{
int[] arrInt = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
String[] arrCh = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int cardTemp = 0;
for(int i = 0; i < 17; i ++)
{
cardTemp += Integer.parseInt(card.substring(i, i+1)) * arrInt[i];
}
String valnum = arrCh[cardTemp % 11];
if (valnum.equals( card.substring(17, 18)))
{
return true;
}
return false;
}
return false;
}
public static String changeFivteenToEighteen(String card){
if(card.length() == 15) {
int[] arrInt = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
String[] arrCh = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int cardTemp = 0;
card = card.substring(0, 6) + "19" + card.substring(6, card.length());
for(int i = 0; i < 17; i ++) {
cardTemp += Integer.parseInt(card.substring(i, i+1) )* arrInt[i];
}
card += arrCh[cardTemp % 11];
return card;
}
return card;
}
public static void main(String[] args) {
System.out.println(nameVerification("孙策"));
System.out.println(phoneVerification("15857324581"));//true
System.out.println(idCardVerification("330781198502074555"));//true
//System.out.println(idCardVerification("110503671231001"));//true
}
}
正则的两个常用方法
1.是否匹配 Pattern.matches(reg,name) //return true,false
2. 正则筛选的字符串
String re_fifteen = "^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$";
Pattern p = Pattern.compile(re_fifteen);
Matcher arr_data = p.matcher(idCard);
while (arr_data.find()) {
int year = Integer.parseInt("19"+arr_data.group(2));
int month = Integer.parseInt(arr_data.group(3));
int day = Integer.parseInt(arr_data.group(4));
Calendar birthday = Calendar.getInstance();
birthday.set(year,month-1,day);
return verifyBirthday(year, month, day, birthday);
}
js前端验证
layui.use(['form','element','layer','jquery'], function (){
var $ = layui.jquery;
var form = layui.form;//自定义验证规则
form.verify({
orderName: function (value){if(value.length <1){return'姓名不能为空';}if(!checkTrueName(value)){return'请输入真实姓名';}},
orderPhone: function (value){if(value.length <1){return'手机号码不能为空';}if(!(/^1(3|4|5|6|7|8|9)\d{9}$/.test(value))){return"请输入有效的手机号码";}}, orderIdCard: function (value){if(value.length <1){return'身份证不能为空';}if(!checkCard(value)){return'请输入有效的身份证!';}}});
form.on('submit(formDemoGO)', function (data){
var index = layer.load();
$.ajax({
url:"mask/order?entryId="+newDate().getTime(),
data : JSON.stringify(data.field),
dataType:'json',
contentType:"application/json;charset-UTF-8",
type:'post',
success:function(result){
var msg = result.msg;if(msg == null ){
msg="";}
var state = result.state;if(state == null ){
state="";}
layer.close(index);if(1==state){
window.location.href ='/successView?oaprPickStartTime='+result.userInfo.oaprPickStartTime
+'&oaprPickEndTime='+result.userInfo.oaprPickEndTime
+'&storeUuid='+result.storeInfo.uuid
+'&userId='+result.userInfo.oaprUuid;}else{
window.location.href ='/errorView?state='+state+'&msg='+msg+'&isSuccess='+result.isSuccess;}},error:function(){
layer.close(index);
window.location.href ='/errorView?state=4&msg=系统繁忙,请稍候!&isSuccess=false';}});returnfalse;});});
function checkTrueName(str){
var reg=/^(([a-zA-Z+\.?\·?a-zA-Z+]{2,30}$)|([\u4e00-\u9fa5+\·?\u4e00-\u9fa5+]{2,30}$))/;//判断用户输入的真实姓名是否为空if(str.length>20){returnfalse;}if(str.length==0){returnfalse;}//检测姓名的格式是否匹配elseif(!reg.test(str)){returnfalse;}else{returntrue;}}
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:"国外"};
function checkCard(card){//是否为空 if(card ===''){returnfalse;}//校验长度,类型 if(isCardNo(card)===false){returnfalse;}//检查省份 if(checkProvince(card)===false){returnfalse;}//校验生日 if(checkBirthday(card)===false){returnfalse;}//检验位的检测 if(checkParity(card)===false){returnfalse;}returntrue;};//检查号码是否符合规范,包括长度,类型
isCardNo =function(card){//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
var reg =/(^\d{15}$)|(^\d{17}(\d|X)$)/;if(reg.test(card)===false){returnfalse;}returntrue;};//取身份证前两位,校验省份
checkProvince =function(card){
var province = card.substr(0,2);if(vcity[province]== undefined){returnfalse;}returntrue;};//检查生日是否正确
checkBirthday =function(card){
var len = card.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 = card.match(re_fifteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday =newDate('19'+year+'/'+month+'/'+day);returnverifyBirthday('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 = card.match(re_eighteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday =newDate(year+'/'+month+'/'+day);returnverifyBirthday(year,month,day,birthday);}returnfalse;};//校验日期
verifyBirthday =function(year,month,day,birthday){
var now =newDate();
var now_year = now.getFullYear();//年月日是否合理 if(birthday.getFullYear()== year &&(birthday.getMonth()+1)== month && birthday.getDate()== day){//判断年份的范围(3岁到100岁之间)
var time = now_year - year;if(time >=3&& time <=100){returntrue;}returnfalse;}returnfalse;};//校验位的检测
checkParity =function(card){//15位转18位
card =changeFivteenToEighteen(card);
var len = card.length;if(len =='18'){
var arrInt =newArray(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
var arrCh =newArray('1','0','X','9','8','7','6','5','4','3','2');
var cardTemp =0, i, valnum;for(i =0; i <17; i ++){
cardTemp += card.substr(i,1)* arrInt[i];}
valnum = arrCh[cardTemp %11];if(valnum == card.substr(17,1)){returntrue;}returnfalse;}returnfalse;};//15位转18位身份证号
changeFivteenToEighteen =function(card){if(card.length =='15'){
var arrInt =newArray(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
var arrCh =newArray('1','0','X','9','8','7','6','5','4','3','2');
var cardTemp =0, i;
card = card.substr(0,6)+'19'+ card.substr(6, card.length -6);for(i =0; i <17; i ++){
cardTemp += card.substr(i,1)* arrInt[i];}
card += arrCh[cardTemp %11];return card;}return card;};