原文

基于字符串的验证和过滤净化库。

Strings only

本代码库仅基于字符串进行验证和过滤净化

如果不确认你的输入是否是一个字符串,可以使用'' + input将其强制转化。如果传入的参数不是字符串,会抛出错误。

安装和使用

服务端使用

npm install validator

No ES6

var validator = require('validator');

validator.isEmail('foo@bar.com'); //=> true

ES6

import validator from 'validator';

或,只引入库的一部分。

import isEmail from 'validator/src/lib/isEmail';

客户端使用

本代码库可以通过script单独加载,或通过[AMD][amd]加载器加载。

<script type="text/javascript" src="validator.min.js"></script>
<script type="text/javascript">
  validator.isEmail('foo@bar.com'); //=> true
</script>

验证器

下表是目前可用的验证器列表。

验证器 说明
equals(str, comparison) 检查两个字符串是否全等。
contains(str, seed) 检查第一个字符串参数中是否包含第二个字符串参数。
matches(str, pattern [, modifiers]) 检查第一个字符串参数是否匹配第二个字符串参数的模式。

支持matches('foo', /foo/i)matches('foo', 'foo', 'i')两种形式。
isAfter(str [, date]) 检查字符串参数日期是否在指定日期之后(默认是现在)。
isAlpha(str [, locale]) 检查字符串参数是否只包含字母(a-zA-Z)。

本地化选项支持['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sk-SK', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA'],默认值是en-US
isAlphanumeric(str [, locale]) 检查字符串参数是否只包含字母和数字。(

本地化选项支持['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sk-SK', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA'],默认值是en-US.
isAscii(str) 检查字符串参数是否只包含ASCII字符。
isBase64(str) 检查字符串参数是否是一个Base64编码形式。
isBefore(str [, date]) 检查字符串参数日期是否在指定日期之前(默认是现在)。
isBoolean(str) 检查字符串参数是否是一个有效的布尔值。
isByteLength(str, options) 检查字符串参数的字节长度(UTF-8字节)是否在指定区间内。

options默认值为{min:0, max: undefined}
isCreditCard(str) 检查字符串参数是否是一个有效的信用卡号。
isCurrency(str, options) 检查字符串参数是否是一个有效的货币数量。

options默认值为{symbol: '$', require_symbol: false, allow_space_after_symbol: false, symbol_after_digits: false, allow_negatives: true, parens_for_negatives: false, negative_sign_before_digits: false, negative_sign_after_digits: false, allow_negative_sign_placeholder: false, thousands_separator: ',', decimal_separator: '.', allow_decimal: true, require_decimal: false, digits_after_decimal: [2], allow_space_after_digits: false}.
Note: 参数digits_after_decimal数组用精确的数字填写,不允许范围,比如范围1到3需要用[1, 2, 3]表示。
isDataURI(str) 检查字符串参数是否是一个data uri格式
isDecimal(str, options) 检查字符串是否是一个有效的数字(包含整数和浮点数),比如0.1,.3,1.1,1.00003,4.0等等。

options的默认值是{force_decimal: false, decimal_digits: '1,', locale: 'en-US'}

locale本地化支持['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'cs-CZ', 'da-DK', 'de-DE', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA'],用来检查小数点的格式。
提醒: decimal_digits用来限定小数位数,’1,3’代表最大3位小数,最小1位小数。
isDivisibleBy(str, number) 检查第一个字符串参数能否被第二个数字参数整除。
isEmail(str [, options]) 检查字符串参数是否是一个合法的邮箱地址。

options参数默认值是{ allow_display_name: false, require_display_name: false, allow_utf8_local_part: true, require_tld: true }。设置allow_display_name为真,则会匹配为Display Name <email-address>。设置require_display_name为真,则会严格匹配为Display Name <email-address>。设置allow_utf8_local_part为假,则不允许非英文的Unicode字符。设置require_tld为假,则不会强制要求域名部分以顶级域名结尾。
isEmpty(str) 检查字符串参数是否是一个空字符串。
isFQDN(str [, options]) 检查字符串参数是否是一个完整有效的域名(比如:domain.com)。

options参数默认值是{ require_tld: true, allow_underscores: false, allow_trailing_dot: false }
isFloat(str [, options]) 检查字符串参数是否是一个有效的数字(包含整数和浮点数)。

可以设置optionsminmaxgt和/或lt,来检查浮点数是否在某个范围内(比如:{ min: 7.22, max: 9.55 }),也可以通过locale来设置本地化。

minmax是“大于等于”或“大于等于”的意思,gtlt是其本身的含义。

本地化locale默认值是’en-US’,支持['ar', 'ar-AE', 'ar-BH', 'ar-DZ', 'ar-EG', 'ar-IQ', 'ar-JO', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-QA', 'ar-QM', 'ar-SA', 'ar-SD', 'ar-SY', 'ar-TN', 'ar-YE', 'cs-CZ', 'da-DK', 'de-DE', 'en-AU', 'en-GB', 'en-HK', 'en-IN', 'en-NZ', 'en-US', 'en-ZA', 'en-ZM', 'es-ES', 'fr-FR', 'hu-HU', 'it-IT', 'nb-NO', 'nl-NL', 'nn-NO', 'pl-PL', 'pt-BR', 'pt-PT', 'ru-RU', 'sr-RS', 'sr-RS@latin', 'sv-SE', 'tr-TR', 'uk-UA']
isFullWidth(str) 检查字符串参数中是否包含全角字符。
isHalfWidth(str) 检查字符串参数中是否包含半角字符。
isHash(str, algorithm) 检查字符串参数是否是一个指定算法的哈希值。

支持的算法有['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b']
isHexColor(str) 检查字符串参数是否是一个有效的十六进制颜色字符串。
isHexadecimal(str) 检查字符串参数是否是一个有效的十六进制数字。
isIP(str [, version]) 检查字符串参数是否是一个有效IP(版本4或6)。
isISBN(str [, version]) 检查字符串参数是否是一个有效的国际标准书号 (版本10或13)。
isISSN(str [, options]) 检查字符串参数是否是一个有效的标准国际刊号ISSN.

options参数默认值是{ case_sensitive: false, require_hyphen: false }。如果case_sensitive设置为真,则ISSN结尾字符'x'为大写。
isISIN(str) 检查字符串参数是否是一个有效的[国际证券识别码ISIN][ISIN] (stock/security identifier).
isISO8601(str) 检查字符串参数是否是一个有效的ISO 8601日期时间字符串
isISO31661Alpha2(str) 检查字符串参数是否是一个有效的ISO 3166-1 alpha-2国家地区代码
isISRC(str) 检查字符串参数是否是一个有效的国际标准音像制品编码ISRC
isIn(str, values) 检查字符串参数是否是数组(包含字符串)或对象(Object)中的一个有效值。
isInt(str [, options]) 检查字符串参数是否是一个有效的整数。

可以设置optionsallow_leading_zeroes,来禁用整数是否可以以0开头,(比如:{ allow_leading_zeroes: false })。
可以设置optionsmin和/或max来检查整数是否在某个范围(包含端点)(比如:{ min: 10, max: 99 })。
可以设置optionsgt和/或lt来检查整数是否在某个区间内(不包含端点)(比如:{gt: 1, lt: 4})。
isJSON(str) 检查字符串参数是否是一个有效的JSON字符串(备注:使用JSON.parse)。
isLatLong(str)                     检查字符串参数是否是一个有效的经纬度坐标,格式:lat,long(lat,long)lat, long(lat, long)
isLength(str, options) 检查字符串参数的长度是否在指定区间内。

options参数默认值是{min:0, max: undefined}。提醒:这个方法将代理对字符视为1。
isLowercase(str) 检查字符串参数是否全是小写格式。
isMACAddress(str) 检查字符串参数是否是有效的MAC地址。
isMD5(str) 检查字符串参数是否是一个MD5哈希值。
isMimeType(str) 检查字符串参数是否是一个有效的MIME类型格式。
isMobilePhone(str, locale) 检查字符串参数是否是一个有效的手机号码,

(locale参数支持['ar-AE', 'ar-DZ','ar-EG', 'ar-JO', 'ar-SA', 'ar-SY', 'cs-CZ', 'de-DE', 'da-DK', 'el-GR', 'en-AU', 'en-CA', 'en-GB', 'en-HK', 'en-IN', 'en-KE', 'en-NG', 'en-NZ', 'en-RW', 'en-SG', 'en-UG', 'en-US', 'en-TZ', 'en-ZA', 'en-ZM', 'en-PK', 'es-ES', 'et-EE', 'fa-IR', 'fi-FI', 'fr-FR', 'he-IL', 'hu-HU', 'it-IT', 'ja-JP', 'ko-KR', 'lt-LT', 'ms-MY', 'nb-NO', 'nn-NO', 'pl-PL', 'pt-PT', 'ro-RO', 'ru-RU', 'sk-SK', 'sr-RS', 'tr-TR', 'uk-UA', 'vi-VN', 'zh-CN', 'zh-HK', 'zh-TW']或’any’。如果使用的是’any’,会尝试匹配所有可用的本地化参数。
isMongoId(str) 检查字符串参数是否是一个有效的用16进制表示的[MongoDB ObjectId][mongoid]。
isMultibyte(str) 检查字符串参数中是否包含多字节字符。
isNumeric(str) 检查字符串参数是否只包含数字(包含符号)。
isPort(str) 检查字符串参数是否是有效的端口号。
isPostalCode(str, locale) 检查字符串参数是否是一个邮政编码,

(locale参数支持[ 'AT', 'AU', 'BE', 'CA', 'CH', 'CN', 'CZ', 'DE', 'DK', 'DZ', 'ES', 'FI', 'FR', 'GB', 'GR', 'IL', 'IN', 'IS', 'IT', 'JP', 'KE', 'LI', 'MX', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SA', 'SE', 'TW', 'US', 'ZA', 'ZM' ]或’any’。如果使用的是’any’,会尝试匹配所有可用的本地化参数。
isSurrogatePair(str) 检查字符串参数中是否包含代理对字符。
isURL(str [, options]) 检查字符串参数是否是一个合法的URL。

options默认值是{ protocols: ['http', 'https', 'ftp'], require_protocol: false, require_valid_protocol: true, require_host: true, require_tld: true, host_whitelist: false, host_blacklist: false, allow_underscores: false, allow_trailing_dot: false, allow_protocol_relative_urls: false }.
isUUID(str [, version]) 检查字符串参数是否是一个UUID(版本3,4或5)。
isUppercase(str) 检查字符串参数是否全是大写格式。
isVariableWidth(str) 检查字符串参数是否同时包含半角和全角字符。
isWhitelisted(str, chars) 检查字符串参数中的所有字符是否都在白名单列表中。

过滤净化器

下表是目前可用的过滤净化器列表。

过滤净化器 说明
blacklist(input, chars) 删除字符串参数中所有出现的黑名单字符。黑名单字符串会被用在正则表达式中,所以需要将字符串编码,比如blacklist(input, '\\[\\]')
escape(input) 将字符<>&'"/替换为HTML实体字符。
unescape(input) 将HTML实体字符替换为<>&'"/
ltrim(input [, chars]) 剪除字符串参数左边的字符(空白或指定字符)。
normalizeEmail(email [, options]) 规范化邮箱地址(这个方法不会验证邮箱的有效性,如果需要验证,使用之前的isEmail方法)。

options参数默认值为:
all_lowercase: true - 将邮箱地址本地部分(@符号之前)都转化为小写字符。注意这个细节跟RFC 5321不完全相符,规范中规定:邮箱服务提供商要信任邮箱中的大写字符(但事实不完全是,邮箱提供商可能没这么做)。邮箱的domain部分是全小写,遵循RFC 1035。
gmail_lowercase: true - GMail邮箱地址忽略大小写,即使all_lowercase设置为假值。请注意all_lowercase即使设置为真值,Gmail地址也会以小写为准。
gmail_remove_dots: true: 删除邮箱中的点号(比如:”john.doe”和”johndoe”完全等价)
gmail_remove_subaddress: true: 删除”sub-addresses”,即+号后面部分(比如:”foo+bar@gmail.com”转化为”foo@gmail.com”)。
gmail_convert_googlemaildotcom: true: 将@googlemail.com转化为@gmail.com,两者是等价的。
outlookdotcom_lowercase: true - Outlook.com邮箱地址(包含Windows Live和Hotmail)忽略大小写,即使all_lowercase设置为假值。请注意all_lowercase即使设置为真值,Outlook.com地址也会以小写为准。
outlookdotcom_remove_subaddress: true: 删除”sub-addresses”,即+号后面部分(比如:”foo+bar@outlook.com”转化为”foo@outlook.com”)。
yahoo_lowercase: true - Yahoo Mail邮箱地址忽略大小写,即使all_lowercase设置为假值。请注意all_lowercase即使设置为真值>,Yahoo Mail地址也会以小写为准。
yahoo_remove_subaddress: true: 删除”sub-addresses”,即-号后面部分(比如:”foo-bar@yahoo.com”转化为”foo@yahoo.com”)。
icloud_lowercase: true - iCloud邮箱地址(包含MobileMe)忽略大小写,即使all_lowercase设置为假值。请注意all_lowercase即使设置为真值,iCloud地址也会以小写为准。
icloud_remove_subaddress: true: 删除”sub-addresses”,即+号后面部分(比如:”foo+bar@icloud.com”转化为”foo@icloud.com”)。
rtrim(input [, chars]) 剪除字符串参数右边的字符(空白或指定字符)。
stripLow(input [, keep_new_lines]) 删除字符串参数中的控制字符(编码小于32和127,几乎所有的控制字符)。如果设置keep_new_linestrue,会保留(\n\r,十六进制0xA0xD)。JavaScript中的Unicode字符是安全的。
toBoolean(input [, strict]) 将字符串参数转化为布尔值,除'0''false'''3个值之外都返回true。在严格模式下,只有'1''true'2个值返回true
toDate(input) 将字符串参数转化为日期对象,当输入参数不合法时返回null
toFloat(input) 将字符串参数转化为浮点数,当输入参数不合法时返回NaN
toInt(input [, radix]) 将字符串参数转化为整数,当输入参数不合法时返回NaN
trim(input [, chars]) 剪除字符串参数左右两边的字符(空白或指定字符)。
whitelist(input, chars) 删除未出现在白名单字符串中的字符。 白名单字符串会被用在正则表达式中,所以需要将字符串编码,比如whitelist(input, '\\[\\]')

XSS 过滤净化

XSS过滤净化功能在2d5d6999从库中移除了。

如果需要,可以选择Yahoo的xss-filters库,或DOMPurify

开发&发布

$ npm start
$ npm run build

阅读

验证器有时会失效,查阅常见错误的编码假设

编者按

仔细阅读这个库的代码,整体质量非常高,除了个别方法中使用能力Array.prototype.includes方法之外,基本上没有兼容性问题。locale的默认值都是’en-us’,可以简单的将其修改为’zh-cn’,方便本地化使用。