123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- /*!
- * Copyright (c) 2014 Chris O'Hara <cohara87@gmail.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
- (function (name, definition) {
- if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
- module.exports = definition();
- } else if (typeof define === 'function' && typeof define.amd === 'object') {
- define(definition);
- } else {
- this[name] = definition();
- }
- })('validator', function (validator) {
- 'use strict';
- validator = { version: '3.19.1' };
- var email = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
- var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/;
- var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/
- , isbn13Maybe = /^(?:[0-9]{13})$/;
- var ipv4Maybe = /^(\d?\d?\d)\.(\d?\d?\d)\.(\d?\d?\d)\.(\d?\d?\d)$/
- , ipv6 = /^::|^::1|^([a-fA-F0-9]{1,4}::?){1,7}([a-fA-F0-9]{1,4})$/;
- var uuid = {
- '3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
- , '4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
- , '5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
- , all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
- };
- var alpha = /^[a-zA-Z]+$/
- , alphanumeric = /^[a-zA-Z0-9]+$/
- , numeric = /^-?[0-9]+$/
- , int = /^(?:-?(?:0|[1-9][0-9]*))$/
- , float = /^(?:-?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][\+\-]?(?:[0-9]+))?$/
- , hexadecimal = /^[0-9a-fA-F]+$/
- , hexcolor = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
- var ascii = /^[\x00-\x7F]+$/
- , multibyte = /[^\x00-\x7F]/
- , fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/
- , halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
- var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
- var base64 = /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$/;
- validator.extend = function (name, fn) {
- validator[name] = function () {
- var args = Array.prototype.slice.call(arguments);
- args[0] = validator.toString(args[0]);
- return fn.apply(validator, args);
- };
- };
- //Right before exporting the validator object, pass each of the builtins
- //through extend() so that their first argument is coerced to a string
- validator.init = function () {
- for (var name in validator) {
- if (typeof validator[name] !== 'function' || name === 'toString' ||
- name === 'toDate' || name === 'extend' || name === 'init') {
- continue;
- }
- validator.extend(name, validator[name]);
- }
- };
- validator.toString = function (input) {
- if (typeof input === 'object' && input !== null && input.toString) {
- input = input.toString();
- } else if (input === null || typeof input === 'undefined' || (isNaN(input) && !input.length)) {
- input = '';
- } else if (typeof input !== 'string') {
- input += '';
- }
- return input;
- };
- validator.toDate = function (date) {
- if (Object.prototype.toString.call(date) === '[object Date]') {
- return date;
- }
- date = Date.parse(date);
- return !isNaN(date) ? new Date(date) : null;
- };
- validator.toFloat = function (str) {
- return parseFloat(str);
- };
- validator.toInt = function (str, radix) {
- return parseInt(str, radix || 10);
- };
- validator.toBoolean = function (str, strict) {
- if (strict) {
- return str === '1' || str === 'true';
- }
- return str !== '0' && str !== 'false' && str !== '';
- };
- validator.equals = function (str, comparison) {
- return str === validator.toString(comparison);
- };
- validator.contains = function (str, elem) {
- return str.indexOf(validator.toString(elem)) >= 0;
- };
- validator.matches = function (str, pattern, modifiers) {
- if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
- pattern = new RegExp(pattern, modifiers);
- }
- return pattern.test(str);
- };
- validator.isEmail = function (str) {
- return email.test(str);
- };
- var default_url_options = {
- protocols: [ 'http', 'https', 'ftp' ]
- , require_tld: true
- , require_protocol: false
- , allow_underscores: false
- };
- validator.isURL = function (str, options) {
- if (!str || str.length >= 2083) {
- return false;
- }
- options = merge(options, default_url_options);
- var ipv4_url_parts = [
- '(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])'
- , '(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}',
- , '(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))'
- ];
- var protocol = '(?:(?:' + options.protocols.join('|') + ')://)' + (options.require_protocol ? '' : '?')
- , auth = '(?:\\S+(?::\\S*)?@)?'
- , ipv4 = '(?:' + ipv4_url_parts.join('') + ')'
- , hostname = '(' + ipv4 + '|' + domain(options) + '|localhost)'
- , port = '(\\d{1,5})'
- , host = hostname + '(?::' + port + ')?'
- , path_query_anchor = '(?:(?:/|\\?|#)[^\\s]*)?';
- var is_url = new RegExp('^(?!mailto:)' + protocol + auth + host + path_query_anchor + '$', 'i')
- , match = str.match(is_url);
- if (!match) {
- return false;
- }
- host = match[1];
- port = match[2];
- if (port && !(port > 0 && port <= 65535)) {
- return false;
- }
- if (options.host_whitelist && options.host_whitelist.indexOf(host) === -1) {
- return false;
- }
- if (options.host_blacklist && options.host_blacklist.indexOf(host) !== -1) {
- return false;
- }
- return true;
- };
- validator.isIP = function (str, version) {
- version = validator.toString(version);
- if (!version) {
- return validator.isIP(str, 4) || validator.isIP(str, 6);
- } else if (version === '4') {
- if (!ipv4Maybe.test(str)) {
- return false;
- }
- var parts = str.split('.').sort(function (a, b) {
- return a - b;
- });
- return parts[3] <= 255;
- }
- return version === '6' && ipv6.test(str);
- };
- var default_fqdn_options = {
- require_tld: true
- , allow_underscores: false
- };
- validator.isFQDN = function (str, options) {
- options = merge(options, default_fqdn_options);
- return new RegExp('^' + domain(options) + '$', 'i').test(str);
- };
- validator.isAlpha = function (str) {
- return alpha.test(str);
- };
- validator.isAlphanumeric = function (str) {
- return alphanumeric.test(str);
- };
- validator.isNumeric = function (str) {
- return numeric.test(str);
- };
- validator.isHexadecimal = function (str) {
- return hexadecimal.test(str);
- };
- validator.isHexColor = function (str) {
- return hexcolor.test(str);
- };
- validator.isLowercase = function (str) {
- return str === str.toLowerCase();
- };
- validator.isUppercase = function (str) {
- return str === str.toUpperCase();
- };
- validator.isInt = function (str) {
- return int.test(str);
- };
- validator.isFloat = function (str) {
- return str !== '' && float.test(str);
- };
- validator.isDivisibleBy = function (str, num) {
- return validator.toFloat(str) % validator.toInt(num) === 0;
- };
- validator.isNull = function (str) {
- return str.length === 0;
- };
- validator.isLength = function (str, min, max) {
- var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
- var len = str.length - surrogatePairs.length;
- return len >= min && (typeof max === 'undefined' || len <= max);
- };
- validator.isByteLength = function (str, min, max) {
- return str.length >= min && (typeof max === 'undefined' || str.length <= max);
- };
- validator.isUUID = function (str, version) {
- var pattern = uuid[version ? version : 'all'];
- return pattern && pattern.test(str);
- };
- validator.isDate = function (str) {
- return !isNaN(Date.parse(str));
- };
- validator.isAfter = function (str, date) {
- var comparison = validator.toDate(date || new Date())
- , original = validator.toDate(str);
- return !!(original && comparison && original > comparison);
- };
- validator.isBefore = function (str, date) {
- var comparison = validator.toDate(date || new Date())
- , original = validator.toDate(str);
- return original && comparison && original < comparison;
- };
- validator.isIn = function (str, options) {
- if (!options || typeof options.indexOf !== 'function') {
- return false;
- }
- if (Object.prototype.toString.call(options) === '[object Array]') {
- var array = [];
- for (var i = 0, len = options.length; i < len; i++) {
- array[i] = validator.toString(options[i]);
- }
- options = array;
- }
- return options.indexOf(str) >= 0;
- };
- validator.isCreditCard = function (str) {
- var sanitized = str.replace(/[^0-9]+/g, '');
- if (!creditCard.test(sanitized)) {
- return false;
- }
- var sum = 0, digit, tmpNum, shouldDouble;
- for (var i = sanitized.length - 1; i >= 0; i--) {
- digit = sanitized.substring(i, (i + 1));
- tmpNum = parseInt(digit, 10);
- if (shouldDouble) {
- tmpNum *= 2;
- if (tmpNum >= 10) {
- sum += ((tmpNum % 10) + 1);
- } else {
- sum += tmpNum;
- }
- } else {
- sum += tmpNum;
- }
- shouldDouble = !shouldDouble;
- }
- return !!((sum % 10) === 0 ? sanitized : false);
- };
- validator.isISBN = function (str, version) {
- version = validator.toString(version);
- if (!version) {
- return validator.isISBN(str, 10) || validator.isISBN(str, 13);
- }
- var sanitized = str.replace(/[\s-]+/g, '')
- , checksum = 0, i;
- if (version === '10') {
- if (!isbn10Maybe.test(sanitized)) {
- return false;
- }
- for (i = 0; i < 9; i++) {
- checksum += (i + 1) * sanitized.charAt(i);
- }
- if (sanitized.charAt(9) === 'X') {
- checksum += 10 * 10;
- } else {
- checksum += 10 * sanitized.charAt(9);
- }
- if ((checksum % 11) === 0) {
- return !!sanitized;
- }
- } else if (version === '13') {
- if (!isbn13Maybe.test(sanitized)) {
- return false;
- }
- var factor = [ 1, 3 ];
- for (i = 0; i < 12; i++) {
- checksum += factor[i % 2] * sanitized.charAt(i);
- }
- if (sanitized.charAt(12) - ((10 - (checksum % 10)) % 10) === 0) {
- return !!sanitized;
- }
- }
- return false;
- };
- validator.isJSON = function (str) {
- try {
- JSON.parse(str);
- } catch (e) {
- return false;
- }
- return true;
- };
- validator.isMultibyte = function (str) {
- return multibyte.test(str);
- };
- validator.isAscii = function (str) {
- return ascii.test(str);
- };
- validator.isFullWidth = function (str) {
- return fullWidth.test(str);
- };
- validator.isHalfWidth = function (str) {
- return halfWidth.test(str);
- };
- validator.isVariableWidth = function (str) {
- return fullWidth.test(str) && halfWidth.test(str);
- };
- validator.isSurrogatePair = function (str) {
- return surrogatePair.test(str);
- };
- validator.isBase64 = function (str) {
- return base64.test(str);
- };
- validator.ltrim = function (str, chars) {
- var pattern = chars ? new RegExp('^[' + chars + ']+', 'g') : /^\s+/g;
- return str.replace(pattern, '');
- };
- validator.rtrim = function (str, chars) {
- var pattern = chars ? new RegExp('[' + chars + ']+$', 'g') : /\s+$/g;
- return str.replace(pattern, '');
- };
- validator.trim = function (str, chars) {
- var pattern = chars ? new RegExp('^[' + chars + ']+|[' + chars + ']+$', 'g') : /^\s+|\s+$/g;
- return str.replace(pattern, '');
- };
- validator.escape = function (str) {
- return (str.replace(/&/g, '&')
- .replace(/"/g, '"')
- .replace(/'/g, ''')
- .replace(/</g, '<')
- .replace(/>/g, '>'));
- };
- validator.stripLow = function (str, keep_new_lines) {
- var chars = keep_new_lines ? '\x00-\x09\x0B\x0C\x0E-\x1F\x7F' : '\x00-\x1F\x7F';
- return validator.blacklist(str, chars);
- };
- validator.whitelist = function (str, chars) {
- return str.replace(new RegExp('[^' + chars + ']+', 'g'), '');
- };
- validator.blacklist = function (str, chars) {
- return str.replace(new RegExp('[' + chars + ']+', 'g'), '');
- };
- validator.normalizeEmail = function (email) {
- var parts = email.toLowerCase().split('@', 2);
- if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
- parts[0] = parts[0].replace(/\./g, '').split('+')[0];
- email = parts.join('@');
- }
- return email;
- };
- function merge(obj, defaults) {
- obj = obj || {};
- for (var key in defaults) {
- if (typeof obj[key] === 'undefined') {
- obj[key] = defaults[key];
- }
- }
- return obj;
- }
- function domain(options) {
- var sep = '-?-?' + (options.allow_underscores ? '_?' : '')
- , alpha = 'a-z\\u00a1-\\uffff'
- , alphanum = alpha + '0-9'
- , subdomain = '(?:(?:[' + alphanum + ']+' + sep + ')*[' + alphanum + ']+)'
- , tld = '(?:\\.(?:[' + alpha + ']{2,}))' + (options.require_tld ? '' : '?');
- return '(?:' + subdomain + '(?:\\.' + subdomain + ')*' + tld + ')';
- }
- validator.init();
- return validator;
- });
|