test.ts 6.4 KB

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