You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
5.9 KiB

5 months ago
  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. */
  23. export 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. export 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. export function number(value) {
  39. return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
  40. }
  41. /**
  42. * 验证字符串
  43. */
  44. export function string(value) {
  45. return typeof value === 'string'
  46. }
  47. /**
  48. * 验证整数
  49. */
  50. export function digits(value) {
  51. return /^\d+$/.test(value)
  52. }
  53. /**
  54. * 验证身份证号码
  55. */
  56. export 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. export 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. export 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. export function chinese(value) {
  87. const reg = /^[\u4e00-\u9fa5]+$/gi
  88. return reg.test(value)
  89. }
  90. /**
  91. * 只能输入字母
  92. */
  93. export function letter(value) {
  94. return /^[a-zA-Z]*$/.test(value)
  95. }
  96. /**
  97. * 只能是字母或者数字
  98. */
  99. export function enOrNum(value) {
  100. // 英文或者数字
  101. const reg = /^[0-9a-zA-Z]*$/g
  102. return reg.test(value)
  103. }
  104. /**
  105. * 验证是否包含某个值
  106. */
  107. export function contains(value, param) {
  108. return value.indexOf(param) >= 0
  109. }
  110. /**
  111. * 验证一个值范围[min, max]
  112. */
  113. export function range(value, param) {
  114. return value >= param[0] && value <= param[1]
  115. }
  116. /**
  117. * 验证一个长度范围[min, max]
  118. */
  119. export function rangeLength(value, param) {
  120. return value.length >= param[0] && value.length <= param[1]
  121. }
  122. /**
  123. * 是否固定电话
  124. */
  125. export 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. export 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. export 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. export 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. export function object(value) {
  184. return Object.prototype.toString.call(value) === '[object Object]'
  185. }
  186. /**
  187. * 是否短信验证码
  188. */
  189. export function code(value, len = 6) {
  190. return new RegExp(`^\\d{${len}}$`).test(value)
  191. }
  192. /**
  193. * 是否函数方法
  194. * @param {Object} value
  195. */
  196. export function func(value) {
  197. return typeof value === 'function'
  198. }
  199. /**
  200. * 是否promise对象
  201. * @param {Object} value
  202. */
  203. export function promise(value) {
  204. return object(value) && func(value.then) && func(value.catch)
  205. }
  206. /**
  207. * @param {Object} value
  208. */
  209. export 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. export 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. export 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. }