一、概述
PHP中的filter_var和filter_var_array函数,主要是做来做验证的。提到这两个函数,就需要了解一下PHP的过滤器。如下:
There are two main types of filtering: validationand sanitization.
Validationis used to validate or check if the data meets certain qualifications. For example, passing in FILTER_VALIDATE_EMAIL will determine if the data is a valid email address, but will not change the data itself.
Sanitizationwill sanitize the data, so it may alter it by removing undesired characters. For example, passing in FILTER_SANITIZE_EMAIL will remove characters that are inappropriate for an email address to contain. That said, it does not validate the data.
即,php的过滤器主要有两种类型,一种是校正数据是否符合某种格式,这种类型不会修改原始数据;
另外一种是清理数据,以修改数据以符合某种格式,这种类型会修改数据。这些过滤器,都是PHP中定义好的一些常量,我们可以通过下面的方式,来获取常量的值:php -r "print_r(FILTER_SANITIZE_SPECIAL_CHARS);" // 返回FILTER_SANITIZE_SPECIAL_CHARS过滤器对应的值,即过滤器的id
当然,通过过滤器的名字,调用int filter_id ( string $filtername ),也可以查看过滤器的id。
1、常用的验证过滤器(Validate filters)过滤ID名字
(Name)选项
(option)标志
(flags)描述
FILTER_VALIDATE_BOOLEAN"boolean""default"FILTER_NULL_ON_FAILURE若为 "1", "true", "on" and "yes",则返回true;否则返回false。
如果设置了标识符FILTER_NULL_ON_FAILURE,"0", "false", "off", "no", and "",返回false,其他的返回NULL
FILTER_VALIDATE_DOMAINvalidate_domaindefaultFILTER_FLAG_HOSTNAME验证域名
FILTER_VALIDATE_EMAILvalidate_emaildefaultFILTER_FLAG_EMAIL_UNICODE验证值是否为邮箱
FILTER_VALIDATE_FLOATfloatdefault, decimalFILTER_FLAG_ALLOW_THOUSAND把值作为浮点数来验证
FILTER_VALIDATE_INTintdefault, min_range, max_rangeFILTER_FLAG_ALLOW_OCTAL,
FILTER_FLAG_ALLOW_HEX把纸作为整数
FILTER_VALIDATE_IPvalidate_ipdefaultFILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE验证是否为有效的ip地址
FILTER_VALIDATE_MACvalidate_mac_addressdefault验证当前值是否为mac地址
FILTER_VALIDATE_REGEXPvalidate_regexpdefault验证是否为正在表达式
FILTER_VALIDATE_URLvalidate_urldefaultFILTER_FLAG_SCHEME_REQUIRED, FILTER_FLAG_HOST_REQUIRED, FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED验证是否为有效的url
2、常用的清理过滤器(Sanitize filters)过滤ID名字
(Name)标志
(flags)描述
FILTER_SANITIZE_EMAILemail删除所有字符,除了字母、数字以及 !#$%&'*+-/=?^_`{|}~@.[]
FILTER_SANITIZE_ENCODEDencodedFILTER_FLAG_STRIP_LOW
, FILTER_FLAG_STRIP_HIGH,
FILTER_FLAG_STRIP_BACKTICK,
FILTER_FLAG_ENCODE_LOW,
FILTER_FLAG_ENCODE_HIGHURL-encode 字符串,去除或编码特殊字符
FILTER_SANITIZE_MAGIC_QUOTESmagic_quotes应用 addslashes()
FILTER_SANITIZE_NUMBER_FLOATnumber_floatFILTER_FLAG_ALLOW_FRACTION
, FILTER_FLAG_ALLOW_THOUSAND,
FILTER_FLAG_ALLOW_SCIENTIFIC删除所有字符,除了数字、+- 以及 .,eE
FILTER_SANITIZE_NUMBER_INTnumber_int删除所有字符,除了数字和 +-
FILTER_SANITIZE_SPECIAL_CHARSspecial_charsFILTER_FLAG_STRIP_LOW,
FILTER_FLAG_STRIP_HIGH,
FILTER_FLAG_STRIP_BACKTICK,
FILTER_FLAG_ENCODE_HIGHHTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符
3、如何查询所支持的过滤器列表呢
查询支持的过滤器列表,可以使用filter_list方法,如下:array filter_list ( void )
返回值:返回一个所支持的过滤器的名称的列表,如果没有这样子的过滤器的话则返回空数组。这个数组的索引不是过滤器id, 你可以通过 filter_id() 去根据名称获取它们。
二、filter_var函数的使用
1、函数简介
filter_var,是使用特定的过滤器来过滤一个变量。函数定义如下:mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )
参数:
$variable 待过滤的变量,必须,如果不是字符串,PHP会自动依据转换规则,将其转为字符串。
$filter 过滤使用的过滤器ID,可选。
$option一个选项的关联数组,或者按位区分的标示。如果过滤器接受选项,可以通过数组的 "flags" 位去提供这些标示。
返回值:如果通过验证,返回过滤后的数据,否则返回false。
2、案例
比如使用FILTER_VALIDATE_INT过滤器,验证是否为整数,如下:$var = filter_var('12', FILTER_VALIDATE_INT);
var_dump($var); // 通过验证,返回12
$var = filter_var('12a', FILTER_VALIDATE_INT);
var_dump($var); // 验证失败,返回false
当然,我们还可以通过第三个参数,来设置整数的访问,以及默认的返回值。可以参考上面的验证过滤器规则,比如:$options = array(
'options' => array(
'default' => 0, // 验证失败的返回值
'min_range' => 1, // 整数的最小值
'max_range' => 100 // 整数的最大值
),
'flags' => FILTER_FLAG_ALLOW_OCTAL,
);
$var = filter_var('5', FILTER_VALIDATE_INT, $options);
var_dump($var);
要求验证的整数范围为1~100,如果验证失败,则返回0