test.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /**
  2. * 验证电子邮箱格式
  3. */
  4. export function email(value) {
  5. return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
  6. }
  7. /**
  8. * 验证手机格式
  9. */
  10. export function mobile(value) {
  11. return /^1[23456789]\d{9}$/.test(value)
  12. }
  13. /**
  14. * 验证URL格式
  15. */
  16. export function url(value) {
  17. return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
  18. .test(value)
  19. }
  20. /**
  21. * 验证日期格式
  22. * @param {number | string} value yyyy-mm-dd hh:mm:ss 或 时间戳
  23. */
  24. export function date(value) {
  25. if (!value) return false;
  26. // number类型,判断是否是时间戳
  27. if (typeof value === "number") {
  28. // len === 10 秒级时间戳 len === 13 毫秒级时间戳
  29. if (value.toString().length !== 10 && value.toString().length !== 13) {
  30. return false;
  31. }
  32. return !isNaN(new Date(value).getTime());
  33. }
  34. if (typeof value === "string") {
  35. // 是否为string类型时间戳
  36. const numV = Number(value);
  37. if (!isNaN(numV)) {
  38. if (
  39. numV.toString().length === 10 ||
  40. numV.toString().length === 13
  41. ) {
  42. return !isNaN(new Date(numV).getTime());
  43. }
  44. }
  45. // 非时间戳,且长度在yyyy-mm-dd 至 yyyy-mm-dd hh:mm:ss 之间
  46. if (value.length < 10 || value.length > 19) {
  47. return false;
  48. }
  49. const dateRegex =
  50. /^\d{4}[-\/]\d{2}[-\/]\d{2}( \d{1,2}:\d{2}(:\d{2})?)?$/;
  51. if (!dateRegex.test(value)) {
  52. return false;
  53. }
  54. // 检查是否为有效日期
  55. const dateValue = new Date(value);
  56. return !isNaN(dateValue.getTime());
  57. }
  58. // 非number和string类型,不做校验
  59. return false;
  60. }
  61. /**
  62. * 验证ISO类型的日期格式
  63. */
  64. export function dateISO(value) {
  65. return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
  66. }
  67. /**
  68. * 验证十进制数字
  69. */
  70. export function number(value) {
  71. return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
  72. }
  73. /**
  74. * 验证字符串
  75. */
  76. export function string(value) {
  77. return typeof value === 'string'
  78. }
  79. /**
  80. * 验证整数
  81. */
  82. export function digits(value) {
  83. return /^\d+$/.test(value)
  84. }
  85. /**
  86. * 验证身份证号码
  87. */
  88. export function idCard(value) {
  89. return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
  90. value
  91. )
  92. }
  93. /**
  94. * 是否车牌号
  95. */
  96. export function carNo(value) {
  97. // 新能源车牌
  98. const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
  99. // 旧车牌
  100. const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/
  101. if (value.length === 7) {
  102. return creg.test(value)
  103. } if (value.length === 8) {
  104. return xreg.test(value)
  105. }
  106. return false
  107. }
  108. /**
  109. * 金额,只允许2位小数
  110. */
  111. export function amount(value) {
  112. // 金额,只允许保留两位小数
  113. return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
  114. }
  115. /**
  116. * 中文
  117. */
  118. export function chinese(value) {
  119. const reg = /^[\u4e00-\u9fa5]+$/gi
  120. return reg.test(value)
  121. }
  122. /**
  123. * 只能输入字母
  124. */
  125. export function letter(value) {
  126. return /^[a-zA-Z]*$/.test(value)
  127. }
  128. /**
  129. * 只能是字母或者数字
  130. */
  131. export function enOrNum(value) {
  132. // 英文或者数字
  133. const reg = /^[0-9a-zA-Z]*$/g
  134. return reg.test(value)
  135. }
  136. /**
  137. * 验证是否包含某个值
  138. */
  139. export function contains(value, param) {
  140. return value.indexOf(param) >= 0
  141. }
  142. /**
  143. * 验证一个值范围[min, max]
  144. */
  145. export function range(value, param) {
  146. return value >= param[0] && value <= param[1]
  147. }
  148. /**
  149. * 验证一个长度范围[min, max]
  150. */
  151. export function rangeLength(value, param) {
  152. return value.length >= param[0] && value.length <= param[1]
  153. }
  154. /**
  155. * 是否固定电话
  156. */
  157. export function landline(value) {
  158. const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
  159. return reg.test(value)
  160. }
  161. /**
  162. * 判断是否为空
  163. */
  164. export function empty(value) {
  165. switch (typeof value) {
  166. case 'undefined':
  167. return true
  168. case 'string':
  169. if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
  170. break
  171. case 'boolean':
  172. if (!value) return true
  173. break
  174. case 'number':
  175. if (value === 0 || isNaN(value)) return true
  176. break
  177. case 'object':
  178. if (value === null || value.length === 0) return true
  179. for (const i in value) {
  180. return false
  181. }
  182. return true
  183. }
  184. return false
  185. }
  186. /**
  187. * 是否json字符串
  188. */
  189. export function jsonString(value) {
  190. if (typeof value === 'string') {
  191. try {
  192. const obj = JSON.parse(value)
  193. if (typeof obj === 'object' && obj) {
  194. return true
  195. }
  196. return false
  197. } catch (e) {
  198. return false
  199. }
  200. }
  201. return false
  202. }
  203. /**
  204. * 是否数组
  205. */
  206. export function array(value) {
  207. if (typeof Array.isArray === 'function') {
  208. return Array.isArray(value)
  209. }
  210. return Object.prototype.toString.call(value) === '[object Array]'
  211. }
  212. /**
  213. * 是否对象
  214. */
  215. export function object(value) {
  216. return Object.prototype.toString.call(value) === '[object Object]'
  217. }
  218. /**
  219. * 是否短信验证码
  220. */
  221. export function code(value, len = 6) {
  222. return new RegExp(`^\\d{${len}}$`).test(value)
  223. }
  224. /**
  225. * 是否函数方法
  226. * @param {Object} value
  227. */
  228. export function func(value) {
  229. return typeof value === 'function'
  230. }
  231. /**
  232. * 是否promise对象
  233. * @param {Object} value
  234. */
  235. export function promise(value) {
  236. return object(value) && func(value.then) && func(value.catch)
  237. }
  238. /** 是否图片格式
  239. * @param {Object} value
  240. */
  241. export function image(value) {
  242. const newValue = value.split('?')[0]
  243. const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
  244. return IMAGE_REGEXP.test(newValue)
  245. }
  246. /**
  247. * 是否视频格式
  248. * @param {Object} value
  249. */
  250. export function video(value) {
  251. const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
  252. return VIDEO_REGEXP.test(value)
  253. }
  254. /**
  255. * 是否为正则对象
  256. * @param {Object}
  257. * @return {Boolean}
  258. */
  259. export function regExp(o) {
  260. return o && Object.prototype.toString.call(o) === '[object RegExp]'
  261. }
  262. export default {
  263. email,
  264. mobile,
  265. url,
  266. date,
  267. dateISO,
  268. number,
  269. digits,
  270. idCard,
  271. carNo,
  272. amount,
  273. chinese,
  274. letter,
  275. enOrNum,
  276. contains,
  277. range,
  278. rangeLength,
  279. empty,
  280. isEmpty: empty,
  281. jsonString,
  282. landline,
  283. object,
  284. array,
  285. code,
  286. func,
  287. promise,
  288. video,
  289. image,
  290. regExp,
  291. string
  292. }