Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

243 строки
17 KiB

  1. const isValidString = (s) => typeof s == 'string' && s.length > 0;
  2. const getLength = (s) => s && s.length || 0;;
  3. const testRegexp = (re) => (v) => !isValidString(v) || re.test(v);
  4. const reEmail = /^(?!\.)((?!.*\.{2})[a-zA-Z0-9\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFFu20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF\.!#$%&'*+-/=?^_`{|}~\-\d]+)@(?!\.)([a-zA-Z0-9\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFF\u20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF\-\.\d]+)((\.([a-zA-Z\u0080-\u00FF\u0100-\u017F\u0180-\u024F\u0250-\u02AF\u0300-\u036F\u0370-\u03FF\u0400-\u04FF\u0500-\u052F\u0530-\u058F\u0590-\u05FF\u0600-\u06FF\u0700-\u074F\u0750-\u077F\u0780-\u07BF\u07C0-\u07FF\u0900-\u097F\u0980-\u09FF\u0A00-\u0A7F\u0A80-\u0AFF\u0B00-\u0B7F\u0B80-\u0BFF\u0C00-\u0C7F\u0C80-\u0CFF\u0D00-\u0D7F\u0D80-\u0DFF\u0E00-\u0E7F\u0E80-\u0EFF\u0F00-\u0FFF\u1000-\u109F\u10A0-\u10FF\u1100-\u11FF\u1200-\u137F\u1380-\u139F\u13A0-\u13FF\u1400-\u167F\u1680-\u169F\u16A0-\u16FF\u1700-\u171F\u1720-\u173F\u1740-\u175F\u1760-\u177F\u1780-\u17FF\u1800-\u18AF\u1900-\u194F\u1950-\u197F\u1980-\u19DF\u19E0-\u19FF\u1A00-\u1A1F\u1B00-\u1B7F\u1D00-\u1D7F\u1D80-\u1DBF\u1DC0-\u1DFF\u1E00-\u1EFF\u1F00-\u1FFF\u20D0-\u20FF\u2100-\u214F\u2C00-\u2C5F\u2C60-\u2C7F\u2C80-\u2CFF\u2D00-\u2D2F\u2D30-\u2D7F\u2D80-\u2DDF\u2F00-\u2FDF\u2FF0-\u2FFF\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF\uA000-\uA48F\uA490-\uA4CF\uA700-\uA71F\uA800-\uA82F\uA840-\uA87F\uAC00-\uD7AF\uF900-\uFAFF]){2,63})+)$/i;
  5. const reUrl = /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i;
  6. const reDateTime = /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[T ]([01][0-9]|2[0-4]):[0-5][0-9](:([0-5][0-9]|60))?Z?$/;
  7. const reDate = /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/;
  8. const reTime = /^([01][0-9]|2[0-4]):[0-5][0-9](:([0-5][0-9]|60))?$/;
  9. const reMonth = /^\d{4}-(0[1-9]|1[012])$/;
  10. const reWeek = /^\d{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$/;
  11. const reColor = /^#[a-fA-F0-9]{6}$/;
  12. const reNumber = /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/;
  13. const reDigits = /^\d+$/;
  14. const reAlphanumeric = /^\w+$/;
  15. const reBic = /^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/;
  16. const reVat = /^((AT)?U[0-9]{8}|(BE)?0[0-9]{9}|(BG)?[0-9]{9,10}|(CY)?[0-9]{8}L|(CZ)?[0-9]{8,10}|(DE)?[0-9]{9}|(DK)?[0-9]{8}|(EE)?[0-9]{9}|(EL|GR)?[0-9]{9}|(ES)?[0-9A-Z][0-9]{7}[0-9A-Z]|(FI)?[0-9]{8}|(FR)?[0-9A-Z]{2}[0-9]{9}|(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3})|(HU)?[0-9]{8}|(IE)?[0-9]S[0-9]{5}L|(IT)?[0-9]{11}|(LT)?([0-9]{9}|[0-9]{12})|(LU)?[0-9]{8}|(LV)?[0-9]{11}|(MT)?[0-9]{8}|(NL)?[0-9]{9}B[0-9]{2}|(PL)?[0-9]{10}|(PT)?[0-9]{9}|(RO)?[0-9]{2,10}|(SE)?[0-9]{12}|(SI)?[0-9]{8}|(SK)?[0-9]{10})$/;
  17. const reInteger = /^-?\d+$/;
  18. const reIpv4 = /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
  19. const reIpv6 = /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/;
  20. const reLettersonly = /^[a-z]+$/i;
  21. const reUnicodelettersonly = /^[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]+$/;
  22. const reLetterswithbasicpunc = /^[a-z\-.,()'"\s]+$/;
  23. const reNowhitespace = /^\S+$/;
  24. const ibanCountryPatterns = {
  25. "AL": "\\d{8}[\\dA-Z]{16}",
  26. "AD": "\\d{8}[\\dA-Z]{12}",
  27. "AT": "\\d{16}",
  28. "AZ": "[\\dA-Z]{4}\\d{20}",
  29. "BE": "\\d{12}",
  30. "BH": "[A-Z]{4}[\\dA-Z]{14}",
  31. "BA": "\\d{16}",
  32. "BR": "\\d{23}[A-Z][\\dA-Z]",
  33. "BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
  34. "CR": "\\d{17}",
  35. "HR": "\\d{17}",
  36. "CY": "\\d{8}[\\dA-Z]{16}",
  37. "CZ": "\\d{20}",
  38. "DK": "\\d{14}",
  39. "DO": "[A-Z]{4}\\d{20}",
  40. "EE": "\\d{16}",
  41. "FO": "\\d{14}",
  42. "FI": "\\d{14}",
  43. "FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
  44. "GE": "[\\dA-Z]{2}\\d{16}",
  45. "DE": "\\d{18}",
  46. "GI": "[A-Z]{4}[\\dA-Z]{15}",
  47. "GR": "\\d{7}[\\dA-Z]{16}",
  48. "GL": "\\d{14}",
  49. "GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
  50. "HU": "\\d{24}",
  51. "IS": "\\d{22}",
  52. "IE": "[\\dA-Z]{4}\\d{14}",
  53. "IL": "\\d{19}",
  54. "IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
  55. "KZ": "\\d{3}[\\dA-Z]{13}",
  56. "KW": "[A-Z]{4}[\\dA-Z]{22}",
  57. "LV": "[A-Z]{4}[\\dA-Z]{13}",
  58. "LB": "\\d{4}[\\dA-Z]{20}",
  59. "LI": "\\d{5}[\\dA-Z]{12}",
  60. "LT": "\\d{16}",
  61. "LU": "\\d{3}[\\dA-Z]{13}",
  62. "MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
  63. "MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
  64. "MR": "\\d{23}",
  65. "MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
  66. "MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
  67. "MD": "[\\dA-Z]{2}\\d{18}",
  68. "ME": "\\d{18}",
  69. "NL": "[A-Z]{4}\\d{10}",
  70. "NO": "\\d{11}",
  71. "PK": "[\\dA-Z]{4}\\d{16}",
  72. "PS": "[\\dA-Z]{4}\\d{21}",
  73. "PL": "\\d{24}",
  74. "PT": "\\d{21}",
  75. "RO": "[A-Z]{4}[\\dA-Z]{16}",
  76. "SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
  77. "SA": "\\d{2}[\\dA-Z]{18}",
  78. "RS": "\\d{18}",
  79. "SK": "\\d{20}",
  80. "SI": "\\d{15}",
  81. "ES": "\\d{20}",
  82. "SE": "\\d{20}",
  83. "CH": "\\d{5}[\\dA-Z]{12}",
  84. "TN": "\\d{20}",
  85. "TR": "\\d{5}[\\dA-Z]{17}",
  86. "AE": "\\d{3}\\d{16}",
  87. "GB": "[A-Z]{4}\\d{14}",
  88. "VG": "[\\dA-Z]{4}\\d{16}"
  89. };
  90. module.exports = {
  91. required: function(value) {
  92. return value && value.length > 0;
  93. },
  94. email: testRegexp(reEmail),
  95. url: testRegexp(reUrl),
  96. datetime: testRegexp(reDateTime),
  97. date: testRegexp(reDate),
  98. time: testRegexp(reTime),
  99. month: testRegexp(reMonth),
  100. week: testRegexp(reWeek),
  101. color: testRegexp(reColor),
  102. number: testRegexp(reNumber),
  103. digits: testRegexp(reDigits),
  104. alphanumeric: testRegexp(reAlphanumeric),
  105. bic: testRegexp(reBic),
  106. vat: testRegexp(reVat),
  107. integer: testRegexp(reInteger),
  108. ipv4: testRegexp(reIpv4),
  109. ipv6: testRegexp(reIpv6),
  110. lettersonly: testRegexp(reLettersonly),
  111. unicodelettersonly: testRegexp(reUnicodelettersonly),
  112. letterswithbasicpunc: testRegexp(reLetterswithbasicpunc),
  113. nowhitespace: testRegexp(reNowhitespace),
  114. pattern: function(value, param) {
  115. const re = new RegExp(`^(?:${param})$`);
  116. return !isValidString(value) || re.test(value);
  117. },
  118. creditcard: function(value) {
  119. if (!isValidString(value)) {
  120. return true;
  121. }
  122. if (/[^0-9 \-]+/.test(value)) {
  123. return false;
  124. }
  125. value = value.replace(/\D/g, '');
  126. if (value.length < 13 || value.length > 19) {
  127. return false;
  128. }
  129. let check = 0, digit = 0, even = false;
  130. for (let i = value.length - 1; i >= 0; i--) {
  131. digit = parseInt(value.charAt(i), 10);
  132. if (even && (digit *= 2) > 9) {
  133. digit -= 9;
  134. }
  135. check += digit;
  136. even = !even;
  137. }
  138. return (check % 10) === 0;
  139. },
  140. iban: function(value) {
  141. if (!isValidString(value)) {
  142. return true;
  143. }
  144. const iban = value.replace(/ /g, '').toUpperCase();
  145. const country = iban.substr(0, 2);
  146. const pattern = ibanCountryPatterns[country];
  147. if (typeof patter !== 'undefined') {
  148. const re = new RegExp(`^[A-Z]{2}\\d{2}${pattern}$`);
  149. if (!re.test(iban)) {
  150. return false;
  151. }
  152. }
  153. let leadingZeroes = true, digits = '', rest = '';
  154. const lookup = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  155. const check = iban.substr(4) + iban.substr(0, 4);
  156. for (let i = 0; i < check.length; i++) {
  157. const ch = check.charAt(i);
  158. if (ch !== '0') {
  159. leadingZeroes = false;
  160. }
  161. if (!leadingZeroes) {
  162. digits += lookup.indexOf(ch);
  163. }
  164. }
  165. for (let i = 0; i < digits.length; i++) {
  166. const ch = digits.charAt(i);
  167. const op = rest + ch;
  168. rest = op % 97;
  169. }
  170. return rest === 1;
  171. },
  172. minlength: function(value, param) {
  173. const length = getLength(value);
  174. return length == 0 || length >= param;
  175. },
  176. maxlength: function(value, param) {
  177. const length = getLength(value);
  178. return length == 0 || length <= param;
  179. },
  180. rangelength: function(value, param) {
  181. const length = getLength(value);
  182. return length == 0 || (length >= param['0'] && length <= param['1']);
  183. },
  184. minitems: function(value, param) {
  185. const length = getLength(value);
  186. return length == 0 || (Array.isArray(value) && length >= param);
  187. },
  188. maxitems: function(value, param) {
  189. const length = getLength(value);
  190. return length == 0 || (Array.isArray(value) && length <= param);
  191. },
  192. rangeitems: function(value, param) {
  193. const length = getLength(value);
  194. return length == 0 || (Array.isArray(value) && length >= param['0'] && length <= param['1']);
  195. },
  196. min: function(value, param) {
  197. return value != null && value != '' && Number(value) >= Number(param);
  198. },
  199. max: function(value, param) {
  200. return value != null && value != '' && Number(value) <= Number(param);
  201. },
  202. range: function(value, param) {
  203. return value != null && value != '' && Number(value) >= Number(param['0']) && Number(value) <= Number(param['1']);
  204. },
  205. equalTo: function(value, param) {
  206. return this.parse(`{{ $_POST.${param.replace(/\[([^\]]+)\]/g, '.$1')} }}`) == value;
  207. },
  208. notEqualTo: function(value, param) {
  209. return this.parse(`{{ $_POST.${param.replace(/\[([^\]]+)\]/g, '.$1')} }}`) != value;
  210. },
  211. };