test.js 5.8 KB

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