忙碌了一周的时间, 终于有个愉快的周末可以放松一下了,昨天大秦去了广州塔,拍了一组美美的照片:


今早上睡了个懒觉,由于路由器前两天坏掉了,准备去买个路由器, 路上打开微信,看到了同事发来的求救信号:


注册不了,第一反应是验证问题,刚好当时距离公司只有两分钟的路程,顺便就来加班搞搞,打开网站,进入注册,直接审查元素(不要问我为什么用了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,所以转换成astrIDno = 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, 倾情打造

