validate.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. import * as dayjs from "dayjs";
  2. /**
  3. * Created by PanJiaChen on 16/11/18.
  4. */
  5. function accMulIn(arg1, arg2) {
  6. let m = 0,
  7. s1 = arg1.toString(),
  8. s2 = arg2.toString();
  9. try {
  10. m += s1.split(".")[1].length;
  11. } catch (e) { }
  12. try {
  13. m += s2.split(".")[1].length;
  14. } catch (e) { }
  15. return (
  16. (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /
  17. Math.pow(10, m)
  18. );
  19. }
  20. /** https
  21. * @param {string} path
  22. * @returns {Boolean}
  23. */
  24. export function isExternal(path) {
  25. return /^(https?:|mailto:|tel:)/.test(path);
  26. }
  27. //区-座-分
  28. export function isqzf(s) {
  29. let type = true;
  30. let arr = s.split("-");
  31. if (arr.length === 3) {
  32. type = setqj(arr[0]) && setzj(arr[1]) && setfj(arr[2]);
  33. } else {
  34. type = false;
  35. }
  36. console.log("console区-座-分 " + type);
  37. return type;
  38. }
  39. // //区-座
  40. export function isqz(s) {
  41. let type = true;
  42. let arr = s.split("-");
  43. if (arr.length === 2) {
  44. type = setqj(arr[0]) && setzj(arr[1]);
  45. } else {
  46. type = false;
  47. }
  48. console.log("console区-座 " + type);
  49. return type;
  50. }
  51. //座-分
  52. export function iszf(s) {
  53. let type = true;
  54. let arr = s.split("-");
  55. if (arr.length === 2) {
  56. type = setzj(arr[0]) && setfj(arr[1]);
  57. } else {
  58. type = false;
  59. }
  60. console.log("console座-分" + type);
  61. return type;
  62. }
  63. //座
  64. export function isz(s) {
  65. let type = true;
  66. let arr = s.split("-");
  67. if (arr.length === 1) {
  68. type = setzj(arr[0]);
  69. } else {
  70. type = false;
  71. }
  72. console.log("console座" + type);
  73. return type;
  74. }
  75. function setqj(s) {
  76. return /0\d{2,3}?$/.test(s) && (s.length == 3 || s.length == 4);
  77. }
  78. function setzj(s) {
  79. return /\d{7,8}$/.test(s) && (s.length == 7 || s.length == 8);
  80. }
  81. function setfj(s) {
  82. return /\d{1,6}$/.test(s) && s.length > 0 && s.length < 7;
  83. }
  84. /** 用户名
  85. * @param {string} str
  86. * @returns {Boolean}
  87. */
  88. export function validUsername(str) {
  89. const valid_map = ["admin", "editor"];
  90. return valid_map.indexOf(str.trim()) >= 0;
  91. }
  92. /** url
  93. * @param {string} url
  94. * @returns {Boolean}
  95. */
  96. export function validURL(url) {
  97. const reg =
  98. /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
  99. return reg.test(url);
  100. }
  101. /** 小写字母
  102. * @param {string} str
  103. * @returns {Boolean}
  104. */
  105. export function validLowerCase(str) {
  106. const reg = /^[a-z]+$/;
  107. return reg.test(str);
  108. }
  109. /** 大写字母
  110. * @param {string} str
  111. * @returns {Boolean}
  112. */
  113. export function validUpperCase(str) {
  114. const reg = /^[A-Z]+$/;
  115. return reg.test(str);
  116. }
  117. /** 字母
  118. * @param {string} str
  119. * @returns {Boolean}
  120. */
  121. export function validAlphabets(str) {
  122. const reg = /^[A-Za-z]+$/;
  123. return reg.test(str);
  124. }
  125. /** 邮箱
  126. * @param {string} email
  127. * @returns {Boolean}
  128. */
  129. export function validEmail(email) {
  130. const reg =
  131. /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  132. return reg.test(email);
  133. }
  134. /** 字符串
  135. * @param {string} str
  136. * @returns {Boolean}
  137. */
  138. export function isString(str) {
  139. if (typeof str === "string" || str instanceof String) {
  140. return true;
  141. }
  142. return false;
  143. }
  144. /** 数组
  145. * @param {Array} arg
  146. * @returns {Boolean}
  147. */
  148. export function isArray(arg) {
  149. if (typeof Array.isArray === "undefined") {
  150. return Object.prototype.toString.call(arg) === "[object Array]";
  151. }
  152. return Array.isArray(arg);
  153. }
  154. /**
  155. * 邮箱
  156. * @param {*} s
  157. */
  158. export function isEmail(s) {
  159. return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(
  160. s
  161. );
  162. }
  163. /**
  164. * 手机号码
  165. * @param {*} s
  166. */
  167. export function isMobile(s) {
  168. return isM(s) || isHK(s);
  169. }
  170. // 手机号码
  171. function isM(s) {
  172. return /^1[3|4|5|6|7|8|9][0-9]\d{8}$/.test(s);
  173. }
  174. // 香港手机号码
  175. function isHK(s) {
  176. return /^852[3|5|6|8|9]\d{7}$/.test(s);
  177. }
  178. /**
  179. * 电话号码
  180. * @param {*} s
  181. */
  182. export function isPhone(s) {
  183. return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s);
  184. }
  185. /**
  186. * 微信号
  187. * @param {*} s
  188. */
  189. export function isWeixin(s) {
  190. return /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test(s);
  191. }
  192. /**
  193. * qq号
  194. * @param {*} s
  195. */
  196. export function isQQ(s) {
  197. return /^[1-9][0-9]{4,14}$/.test(s);
  198. }
  199. /**
  200. * 固定电话(支持分机)
  201. * @param {*} s
  202. */
  203. export function isExtension(s) {
  204. let type = true;
  205. let arr = s.split("-");
  206. // console.log(arr);
  207. if (arr.length === 2 || arr.length === 3) {
  208. type = setF(arr);
  209. } else {
  210. type = false;
  211. }
  212. // console.log('console' + type);
  213. return type;
  214. ///0\d{2,3}-\d{7,8}(-\d{1,6})?/.test(s)
  215. }
  216. function setF(arr) {
  217. let type1 = true,
  218. type2 = true,
  219. type3 = true;
  220. type1 = /0\d{2,3}?$/.test(arr[0]);
  221. type2 =
  222. arr[1].length === 7 || arr[1].length === 8
  223. ? /\d{7,8}$/.test(arr[1])
  224. : false;
  225. if (arr.length === 3) {
  226. type3 =
  227. arr[2].length === 0 || arr[2].length > 6
  228. ? false
  229. : /\d{1,6}$/.test(arr[2]);
  230. }
  231. // console.log(type1, type2, type3);
  232. if (arr.length === 2) {
  233. return type1 && type2;
  234. } else {
  235. return type1 && type2 && type3;
  236. }
  237. }
  238. // (^(\d{11})$|^((\d{3}-)?\d{8}(-\d{1,4})?)$|^((\d{4}-)?\d{7}(-\d{1,4})?)$|^(\d{7,8})$)
  239. /**
  240. * 纳税人识别号
  241. * @param {*} s
  242. */
  243. export function isLicense(s) {
  244. return /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/.test(s);
  245. }
  246. /**
  247. * 身份证号码
  248. * @param {*} s
  249. */
  250. export function isIDentityCard(s) {
  251. return /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(
  252. s
  253. );
  254. }
  255. /**
  256. * URL地址
  257. * @param {*} s
  258. */
  259. export function isURL(s) {
  260. return /^http[s]?:\/\/.*/.test(s);
  261. }
  262. /**
  263. * 汉语
  264. * @param {*} s
  265. */
  266. export function isChinese(s) {
  267. return /[\u4e00-\u9fa5]$/.test(s);
  268. }
  269. /**
  270. * 数字
  271. * @param {*} s
  272. */
  273. export function isnumber(s) {
  274. return /^[0-9]*$/.test(s);
  275. }
  276. /**
  277. * 数字或者带小数点的数字
  278. * @param {*} s
  279. */
  280. export function isnumber2(s) {
  281. return /(^[0-9]{1,2}$)|(^[0-9]{1,2}[\.]{1}[0-9]{1,2}$)/.test(s);
  282. }
  283. /**
  284. * 数字或者带小数点的数字 1,2,3位小数
  285. * @param {*} s
  286. */
  287. export function isnumber3(s) {
  288. return /^(([^0][0-9]+|0)\.([0-9]{1,3})$)|^([^0][0-9]+|0)$/.test(s);
  289. }
  290. /**
  291. * 数字字母
  292. * @param {*} s
  293. */
  294. export function isAlphanumeric(s) {
  295. return /^[0-9A-Za-z]*$/.test(s);
  296. }
  297. /**
  298. * 数字大写字母
  299. * @param {*} s
  300. */
  301. export function isNumeric(s) {
  302. return /^[0-9A-Z]*$/.test(s);
  303. }
  304. /**
  305. * 表情包
  306. * @param {*} s
  307. */
  308. export function isEmoticon(s) {
  309. const reg =
  310. /[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF\u0080-\u009F\u2000-\u201f\u2026\u2022\u20ac\r\n]/g;
  311. // console.log(reg.test(s));
  312. return reg.test(s);
  313. }
  314. /**
  315. * 判断是否为微信浏览器
  316. * @param {*} s
  317. */
  318. export function JudgeEnvironment() {
  319. const ua = navigator.userAgent.toLowerCase();
  320. let environment = "";
  321. const isWeixin = ua.indexOf("micromessenger") != -1;
  322. if (isWeixin) {
  323. environment = "Weixin";
  324. }
  325. const isWelink = ua.indexOf("huawei-anyoffice") != -1;
  326. if (isWelink) {
  327. environment = "Welink";
  328. }
  329. const isDingDing = ua.indexOf("dingtalk") != -1;
  330. if (isDingDing) {
  331. environment = "isDingDing";
  332. }
  333. if (environment === "") {
  334. environment = "otherBrowser";
  335. }
  336. return environment;
  337. }
  338. export function timestampToTime(timestamp) {
  339. const date = new Date(timestamp); // 时间戳为10位需*1000,时间戳为13位的话不需乘1000
  340. const Y = date.getFullYear() + "-";
  341. const M =
  342. (date.getMonth() + 1 < 10
  343. ? "0" + (date.getMonth() + 1)
  344. : date.getMonth() + 1) + "-";
  345. const D = date.getDate() + " ";
  346. let h = date.getHours();
  347. h = h < 10 ? `0${h}:` : h + ":";
  348. let m = date.getMinutes();
  349. m = m < 10 ? `0${m}:` : m + ":";
  350. let s = date.getSeconds();
  351. s = s < 10 ? `0${s}` : s;
  352. return Y + M + D + h + m + s;
  353. }
  354. export function isCreditCode(s) {
  355. const reg = /[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/g;
  356. return reg.test(s);
  357. }
  358. //加法精算
  359. export function add_sum(arg1, arg2) {
  360. let r1, r2, m;
  361. try {
  362. r1 = arg1.toString().split(".")[1].length;
  363. } catch (e) {
  364. r1 = 0;
  365. }
  366. try {
  367. r2 = arg2.toString().split(".")[1].length;
  368. } catch (e) {
  369. r2 = 0;
  370. }
  371. m = Math.pow(10, Math.max(r1, r2));
  372. const s = (accMulIn(arg1, m) + accMulIn(arg2, m)) / m;
  373. return s;
  374. }
  375. //乘法精算
  376. export function accMul(arg1, arg2) {
  377. const s = accMulIn(arg1, arg2);
  378. console.log(`${arg1}*${arg2}=${s}`);
  379. return s;
  380. }
  381. //除法精度问题
  382. export function accDiv(arg1, arg2) {
  383. let t1 = 0,
  384. t2 = 0,
  385. c1,
  386. c2;
  387. try {
  388. t1 = arg1.toString().split(".")[1].length;
  389. } catch (e) { }
  390. try {
  391. t2 = arg2.toString().split(".")[1].length;
  392. } catch (e) { }
  393. // with (Math) {
  394. c1 = Number(arg1.toString().replace(".", ""));
  395. c2 = Number(arg2.toString().replace(".", ""));
  396. const s = (c1 / c2) * Math.pow(10, t2 - t1);
  397. console.log(`${arg1}/${arg2}=${s}`);
  398. return s;
  399. }
  400. //减法精度问题
  401. // export function accSub(arg1, arg2) {
  402. // var r1, r2, m, n;
  403. // try {
  404. // r1 = arg1.toString().split(".")[1].length;
  405. // } catch (e) {
  406. // r1 = 0;
  407. // }
  408. // try {
  409. // r2 = arg2.toString().split(".")[1].length;
  410. // } catch (e) {
  411. // r2 = 0;
  412. // }
  413. // m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
  414. // n = r1 >= r2 ? r1 : r2;
  415. // const s = ((arg1 * m - arg2 * m) / m).toFixed(n);
  416. // console.log(`${arg1}-${arg2}=${s}`);
  417. // return s;
  418. // }
  419. // export function isSpecialSymbol(s) {
  420. // // console.log(s);
  421. // const str = (s ?? "").replace(
  422. // /\\|\/|\"|\'|\<|\>|\{|\}|\[|\]|\:|\^|\$|\!|\~|\`|\|/g,
  423. // ""
  424. // );
  425. // // console.log(str);
  426. // const pattern = new RegExp("[`~!@#$^&()=|{}':;',<>/?]");
  427. // let specialStr = "";
  428. // for (let i = 0; i < str.length; i++) {
  429. // specialStr += str.substr(i, 1).replace(pattern, "");
  430. // }
  431. // return s.length > specialStr.length;
  432. // }
  433. // export function isAddr(s) {
  434. // let isok = false;
  435. // const regList = [
  436. // "多地",
  437. // "另给",
  438. // "线下",
  439. // "地址",
  440. // "单独给",
  441. // "内部沟通",
  442. // "微信",
  443. // "钉钉",
  444. // "短信",
  445. // "文件",
  446. // "另外",
  447. // "后面",
  448. // "以后",
  449. // "晚点",
  450. // "后补",
  451. // "再给",
  452. // ];
  453. // for (let i = 0; i < regList.length; i++) {
  454. // const is = s.includes(regList[i]);
  455. // if (is) {
  456. // isok = is;
  457. // }
  458. // }
  459. // const sstr = /^[0-9A-Za-z]*$/;
  460. // if (sstr.test(s)) {
  461. // isok = true;
  462. // }
  463. // if (!isok) {
  464. // let reslist = [];
  465. // let str = "";
  466. // for (let i = 0; i < s.length; i++) {
  467. // let isa = sstr.test(s[i]);
  468. // // console.log(isa);
  469. // if (isa) {
  470. // str += s[i];
  471. // } else {
  472. // reslist.push(str);
  473. // str = "";
  474. // }
  475. // if (i === s.length - 1) {
  476. // reslist.push(str);
  477. // str = "";
  478. // }
  479. // }
  480. // for (let b = 0; b < reslist.length; b++) {
  481. // if (reslist[b].length > 5) {
  482. // isok = true;
  483. // }
  484. // }
  485. // }
  486. // return !isok;
  487. // }
  488. export function hasSpace(s) {
  489. // const str1 = s.replace(/\s/g, "");
  490. // \a 007 响铃(BEL)
  491. // \b 008 退格(BS) ,将当前位置移到前一列
  492. // \f 012 换页(FF),将当前位置移到下页开头
  493. // \n 010 换行(LF) ,将当前位置移到下一行开头
  494. // \r 013 回车(CR) ,将当前位置移到本行开头
  495. // \t 009 水平制表(HT) (跳到下一个TAB位置)
  496. // \v 011 垂直制表(VT)
  497. // \\ 092 代表一个反斜线字符''\'
  498. // \' 039 代表一个单引号(撇号)字符
  499. // \" 034 代表一个双引号字符
  500. // \? 063 代表一个问号
  501. // \0 000 空字符(NUL)
  502. // \ddd 三位八进制 1到3位八进制数所代表的任意字符 会把数字过滤掉
  503. // \xhh 十六进制 十六进制所代表的任意字符 会把部分字母过滤掉
  504. //
  505. const str2 = s.replace(/[\b\f\n\r\t\v\\\'\"\?\0]/g, "");
  506. console.log(s);
  507. console.log(str2);
  508. return !(str2 === s);
  509. }
  510. function com1(str, arr) {
  511. let s = (arr.find((si) => si.key === str) || {}).value || str;
  512. return s;
  513. }
  514. function com2(str, arr) {
  515. console.log(str);
  516. console.log(arr);
  517. let s = "";
  518. for (let i = 0; i < str.length; i++) {
  519. console.log((arr.find((si) => si.key === str[i]) || {}).value || str[i]);
  520. s += (arr.find((si) => si.key === str[i]) || {}).value || str[i];
  521. }
  522. return s;
  523. }
  524. //营业执照成立日期大写转小写
  525. export function invTime(s) {
  526. s = s.replace(" 00:00:00", "");
  527. //dayjs(s).format('YYYY-MM-DD')
  528. const option = [
  529. { key: "一", value: "1" },
  530. { key: "二", value: "2" },
  531. { key: "三", value: "3" },
  532. { key: "四", value: "4" },
  533. { key: "五", value: "5" },
  534. { key: "六", value: "6" },
  535. { key: "七", value: "7" },
  536. { key: "八", value: "8" },
  537. { key: "九", value: "9" },
  538. ];
  539. const year = [
  540. { key: "0", value: "0" },
  541. { key: "零", value: "0" },
  542. ].concat(option);
  543. const day1 = [{ key: "十", value: "10" }].concat(option);
  544. const day2 = [{ key: "十", value: "1" }];
  545. let str = ["年", "月", "日"];
  546. let si = s.replace(/[\r\n]/g, "").replace(/\s/g, "");
  547. let arr1 = "",
  548. arr2 = "",
  549. arr3 = "";
  550. for (let i = 0; i < str.length; i++) {
  551. si = si.replace(str[i], i == 2 ? "" : "-");
  552. }
  553. let arr = si.split("-");
  554. if (arr.length !== 3) {
  555. return s;
  556. } else {
  557. arr1 = com2(arr[0], year);
  558. arr2 =
  559. arr[1].length > 1 ? com2(arr[1], year.concat(day2)) : com1(arr[1], day1);
  560. arr3 =
  561. arr[2].length > 1 ? com2(arr[2], year.concat(day2)) : com1(arr[1], day1);
  562. return `${arr1 + "-" + arr2 + "-" + arr3}`;
  563. }
  564. }
  565. // /[\u4e00-\u9fa5]|[^\u3002\u4e00-\u9fa5]*/g
  566. // 要匹配汉字或者汉字加标点符号的字符串,但不匹配标点符号 (中文段落)
  567. export function ChineseParagraph(s) {
  568. return !s == s.replace(/[\u4e00-\u9fa5]|[^\u3002\u4e00-\u9fa5]*/g, "");
  569. }