validate.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * 邮箱
  3. * @param {*} s
  4. */
  5. export function isEmail (s) {
  6. return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
  7. }
  8. /**
  9. * 手机号码
  10. * @param {*} s
  11. */
  12. export function isMobile (s) {
  13. return /^1[0-9]{10}$/.test(s)
  14. }
  15. /**
  16. * 电话号码
  17. * @param {*} s
  18. */
  19. export function isPhone (s) {
  20. return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
  21. }
  22. /**
  23. * URL地址
  24. * @param {*} s
  25. */
  26. export function isURL (s) {
  27. return /^http[s]?:\/\/.*/.test(s)
  28. }
  29. // 只能输入数字及两位小数
  30. export function limitNumber(s) {
  31. return /^(\d+.?)?\d{0,2}$/.test(s)
  32. }
  33. //身份证验证
  34. export function validateSfz(rule, value, callback) {
  35. if (!value) {
  36. return callback(new Error('身份证号码不能为空'));
  37. }
  38. function validataCredentials(num) {
  39. var msg, boo; // msg身份证验证友情提示,boo返回值
  40. var num = num.toUpperCase(); // 身份证为末尾可能是X
  41. // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,
  42. // 最后一位是校验位,可能为数字或字符X。
  43. const arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
  44. const arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
  45. var nTemp = 0,
  46. i;
  47. if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
  48. // 输入的身份证号长度不对,或者号码不符合规定;
  49. return [boo = false, msg = "身份证号码不符合规定"];
  50. }
  51. // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
  52. // 下面分别分析出生日期和校验位
  53. var len, re;
  54. len = num.length;
  55. if (len == 15) {
  56. re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
  57. var arrSplit = num.match(re);
  58. // 检查生日日期是否正确
  59. var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
  60. var bGoodDay;
  61. bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
  62. if (!bGoodDay) {
  63. // 输入的身份证号里出生日期不对!
  64. return [boo = false, msg = "输入的身份证号里出生日期不对!"];
  65. } else {
  66. // 将15位身份证转成18位
  67. // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
  68. num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
  69. for (i = 0; i < 17; i++) {
  70. nTemp += num.substr(i, 1) * arrInt[i];
  71. }
  72. num += arrCh[nTemp % 11];
  73. return [boo = true, msg = num];
  74. }
  75. }
  76. if (len == 18) {
  77. re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
  78. var arrSplit = num.match(re);
  79. // 检查生日日期是否正确
  80. var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
  81. var bGoodDay;
  82. bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
  83. if (!bGoodDay) {
  84. // 输入的身份证号里出生日期不对!
  85. return [boo = false, msg = " 输入的身份证号里出生日期不对"];
  86. } else {
  87. // 检验18位身份证的校验码是否正确。
  88. // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
  89. var valnum;
  90. for (i = 0; i < 17; i++) {
  91. nTemp += num.substr(i, 1) * arrInt[i];
  92. }
  93. valnum = arrCh[nTemp % 11];
  94. if (valnum != num.substr(17, 1)) {
  95. // 18位身份证的校验码不正确!
  96. return [boo = false, msg = "身份证的校验码不正确!"];
  97. }
  98. return [boo = true, msg = "验证成功"]
  99. }
  100. }
  101. return [boo = false, msg = "身份证的长度不正确!"];
  102. }
  103. setTimeout(() => {
  104. var res = validataCredentials(value);
  105. if (!res[0]) {
  106. callback(new Error(res[1]));
  107. } else {
  108. callback();
  109. }
  110. }, 200);
  111. };