忙碌了一周的时间, 终于有个愉快的周末可以放松一下了,昨天大秦去了广州塔,拍了一组美美的照片:
今早上睡了个懒觉,由于路由器前两天坏掉了,准备去买个路由器, 路上打开微信,看到了同事发来的求救信号:
注册不了,第一反应是验证问题,刚好当时距离公司只有两分钟的路程,顺便就来加班搞搞,打开网站,进入注册,直接审查元素(不要问我为什么用了jquery, 我也很不想用啊,可是这些项目改起来要全部重写一遍呢,哎!):
看引入文件应该是没有在里面, 我们就打开第一个script标签,然后就看到了:
这是验证的代码, 没问题啊, 继续往下读:
看来这里是发送验证码的, 回头看转发的聊天记录:
看来, 是有人修改过但是改漏掉了注册的验证,我们往下翻,果然找到了一段咋一看几乎是一样的代码:
就是它了,确认无疑:
var reg2 = /^1[34578]d{9}$/;
if (!reg2.test(mobile)){
layer.open({
content: '请输入正确手机号'
,skin: 'msg'
,time: 1 //2秒后自动关闭
});
return false;
}
主要是这段正则: /^1[34578]d{9}$/
它的意思是, 匹配第一位数是1,第二位数是3,4,5,6,7或8的一个,后面再跟9位任意数字的字符串,那么问题来了,我们的号码是199,第二位的9是验证失败的,找到原因了,直接改:
var reg2 = /^1[345789]d{9}$/;
if (!reg2.test(mobile)){
layer.open({
content: '请输入正确手机号'
,skin: 'msg'
,time: 1 //2秒后自动关闭
});
return false;
}
保存,我们测试一下:
号码错误的提示没了,说明我们的199号段号码验证通过, 任务完成!
作为一个负责任的程序员,改了人家的代码就得打个备注,提醒自己也帮助他人:(...表示省略的代码片段)
// 2019.6.5新增16和19开头的手机号码段。
var reg2 = /^1[345789]d{9}$/;
...
if (!reg2.test(mobile)){
...
}
【没营养的正文完毕】
【附1】其他常用验证规则:
固话/电话号码: /^((d{3,4})|d{3,4}-|s)?d{7,14}$/
身份证正则(15位): /^[1-9]d{7}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])d{3}$/
身份证正则(18位): /^[1-9]d{5}[1-9]d{3}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])d{4}$/
身份证正则合并: (^d{15}$)|(^d{17}([0-9]|X)$)
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(w|\|/|.)+('|"| *|>)?
提取信息中的邮件地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(w|\|/|.)+('|"| *|>)?
提取信息中的IP地址:(d+).(d+).(d+).(d+)
提取信息中的中国电话号码(包括移动和固定电话):((d{3,4})|d{3,4}-|s)?d{7,14}
提取信息中的中国邮政编码:[1-9]{1}(d+){5}
提取信息中的中国身份证号码:d{18}|d{15}
提取信息中的整数:d+
提取信息中的浮点数(即小数):(-?d*).?d+
提取信息中的任何数字 :(-?d*)(.d+)?
提取信息中的中文字符串:[u4e00-u9fa5]*
提取信息中的双字节字符串 (汉字):[^x00-xff]*
【附2】身份证验证(关联地域ID)
// 身份证验证
function isIDCard(obj) {
var aCity = {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: "国 外"};
var iSum = 0;
//var info = "";
var strIDno = obj;
var idCardLength = strIDno.length;
if (!/^d{17}(d|x)$/i.test(strIDno) && !/^d{15}$/i.test(strIDno))
return false; //非法身份证号
if (aCity[parseInt(strIDno.substr(0, 2))] == null)
return false;// 非法地区
// 15位身份证转换为18位
if (idCardLength == 15)
{
sBirthday = "19" + strIDno.substr(6, 2) + "-" + Number(strIDno.substr(8, 2)) + "-" + Number(strIDno.substr(10, 2));
var d = new Date(sBirthday.replace(/-/g, "/"))
var dd = d.getFullYear().toString() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
if (sBirthday != dd)
return false; //非法生日
strIDno = strIDno.substring(0, 6) + "19" + strIDno.substring(6, 15);
strIDno = strIDno + GetVerifyBit(strIDno);
}
// 判断是否大于2078年,小于1900年
var year = strIDno.substring(6, 10);
if (year < 1900 || year > 2078)
return false;//非法生日
//18位身份证处理
//在后面的运算中x相当于数字10,所以转换成a
strIDno = strIDno.replace(/x$/i, "a");
sBirthday = strIDno.substr(6, 4) + "-" + Number(strIDno.substr(10, 2)) + "-" + Number(strIDno.substr(12, 2));
var d = new Date(sBirthday.replace(/-/g, "/"))
if (sBirthday != (d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate()))
return false; //非法生日
// 身份证编码规范验证
for (var i = 17; i >= 0; i --)
iSum += (Math.pow(2, i) % 11) * parseInt(strIDno.charAt(17 - i), 11);
if (iSum % 11 != 1)
return false;// 非法身份证号
// 判断是否屏蔽身份证
var words = new Array();
words = new Array("11111119111111111", "12121219121212121");
for (var k = 0; k < words.length; k++) {
if (strIDno.indexOf(words[k]) != -1) {
return false;
}
}
// 返回验证结果
return true;
},
原文始发于微信公众号(两点IT):两点IT, 倾情打造