Filter,它的作用就和他的名字一样——过滤。过滤规则成为过滤器,Filter内置了多个常用过滤器,根据过滤器功能的不同,可以分成净化过滤器(Sanitization)和验证过滤器(Validation)两种。两种的差别在于,净化过滤器会把被过滤的变量中不符合规则的东西清除掉,返回清除后的内容;而验证过滤器只是验证的功能,并不会去改变变量的值,如果符合过滤器的规则,则返回变量内容,否则返回false;
安装
Filter的安装很简单,如果是PHP5.2.0之后的版本,应该已经默认打开了,可以通过phpinfo()来查看。如果5.2.0之前的版本,可以使用PECL来使用Filter
使用
使用filter来过滤或验证数据很简单,下面是一个简单的例子
$email1='huanggy@example.org';
$email2="example.org";
$email3="(huanggy@example.org)";
var_dump(filter_var($email1,FILTER_VALIDATE_EMAIL));
var_dump(filter_var($email2,FILTER_VALIDATE_EMAIL));
var_dump(filter_var($email3,FILTER_SANITIZE_EMAIL));
?>
执行上面的例子,你可以知道,filter_var($var,$filter)函数是使用过滤器$filter来过滤变量$var,而透过结果来分析,FILTER_VALIDATE_EMAIL过滤器只是验证变量$email是否负责过滤器规定的规则,符合要求则返回变量内容,不符合则返回false;而FILTER_SANIZE_EMAIL则是对变量的内容进行净化,把不负责规则的内容都清除,然后返回清除后的结果。下面列出Filter所有内置的过滤器
验证过滤器
ID
NAME
OPTIONS
FLAGS
DESCRIBES
FILTER_VALIDATE_BOOLEAN
boolean
FILTER_NULL_ON_FATLURE
FILTER_VALIDATE_EMAIL
validate_email
FILTER_VALIDATE_FLOAT
float
decimal
FILTER_FLAG_ALLOW_THOUSAND
FILTER_VALIDATE_INT
int
min_range,
max_range
FILTER_FLAG_ALLOW_OCTACL
FILTER_FLAG_ALLOW_HEX
FILTER_VALIDATE_IP
validate_ip
FILTER_FLAG_IPV4
FILTER_FLAG_IPV6
FILTER_FLAG_NO_PRIV_RANGE
FILTER_FLAG_NO_RES_RANGE
FILTER_VALIDATE_REGEXP
validate_regexp
regexp
FILTER_VALIDATE_URL
validate_url
FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED
净化过滤器
ID
NAME
OPTIONS
FLAGS
DESCRIBES
FILTER_SANITIZE_EMAIL
FILTER_SANITIZE_ENCODED
encoded
FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_SANITIZE_MAGIC_QUOTES
magic_quotes
FILTER_SANITIZE_NUMBER_FLOAT
number_float
FILTER_FLAG_ALLOW_FRACTION
FILTER_FLAG_ALLOW_THOUSAND
FILTER_FLAG_ALLOW_SCIENTIFIC
FILTER_SANITIZE_NUMBER_INT
number_int
FILTER_SANITIZE_SPECIAL_CHARS
special_chars
FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_HIGH
FILTER_SANITIZE_STRING
string
FILTER_FLAG_NO_ENCODE_QUOTES
FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_FLAG_ENCODE_AMP
FILTER_SANITIZE_STRIPPED
stripped
FILTER_SANITIZE_URL
url
FILTER_UNSAFE_RAW
unsafe_raw
FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_FLAG_ENCODE_AMP
PS.
ID为过滤器的ID,NAME为过滤器的名字,OPTIONS为过滤器的可以配置的参数,FLAG为过滤器的FLAG参数,可以理解长附加选项,DESCRIBES为过滤功能的描述了;其中ID,FLAGS为filter预定义变量,各个变量的具体含义可以查看这里http://cn.php.net/manual/en/filter.constants.php
filter扩展内置的函数有
filter_var($var,[$filter,[$options]]) 使用过滤器$filter过滤$var变量,如果$filter可以使用配置参数,可以第三个参数$options里面配置
e.p
$int= 10;
var_dump(filter_var($int,FILTER_VALIDATE_INT)); # 输出int(10)
$options=array('options'=>array('min_range'=>15));
var_dump(filter_var($int,FILTER_VALIDATE_INT,$options));#输出bool(false)
?>
同样的整形变量10,在我第二个过滤器中加两个配置参数,最小值为15,10不满足这个条件,所以返回fasle
再看下面这个例子
$int='0xf';
var_dump(filter_var($int,FILTER_VALIDATE_INT)); # 输出bool(false)
$options=array('options'=>array('min_range'=>15),'flags'=>FILTER_FLAG_ALLOW_HEX);
var_dump(filter_var($int,FILTER_VALIDATE_INT,$options));#输出int(15)
?>
默认FILTER_VALIDATE_INT过滤认为'0xf'不是整形变量,但是加了FLAGS附件参数FILTER_FLAG_ALLOW_HEX进去,FILTER_FLAG_ALLOW_HEX参数是允许使用十六进制的意思,'0xf'转化为十六进制等于15,符合规则,返回15
基本上就是这么用了 。其他的内置函数大体上也都是这么用,区别在于,有些为了方便大家一次多多个数据进行过滤,像
filter_var_array($data,$filter) $data为被过滤的变量,$filter为过滤器,两者通过key来对应,看下面这个例子你可以很容易的明白这个函数的用图
error_reporting(E_ALL | E_STRICT);
$data=array(
'product_id'=>'libgd
'component'=>'10',
'versions'=>'2.0.33',
'testscalar'=>array('2','23','10','12'),
'testarray'=>'2',
);
$args=array(
'product_id'=> FILTER_SANITIZE_ENCODED,
'component'=>array('filter'=> FILTER_VALIDATE_INT,
'flags'=> FILTER_FORCE_ARRAY,
'options'=>array('min_range'=> 1,'max_range'=> 10)
),
'versions'=> FILTER_SANITIZE_ENCODED,
'doesnotexist'=> FILTER_VALIDATE_INT,
'testscalar'=>array(
'filter'=> FILTER_VALIDATE_INT,
'flags'=> FILTER_REQUIRE_SCALAR,
),
'testarray'=>array(
'filter'=> FILTER_VALIDATE_INT,
'flags'=> FILTER_FORCE_ARRAY,
)
);
$myinputs= filter_var_array($data,$args);
var_dump($myinputs);
echo"/n";
?>
此外还有下面几个内置函数
filter_input($type,$key,[$filter,[$options]])
filter_input_array($data,$filter)
filter_has_var($type,$key);
filter_id($filte)
filter_list()
其中filter_input函数是对PHP环境固有变量进行过滤,并把值赋予$key,$type表示PHP环境变量的类型,有下面
几种
INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV,INPUT_SESSION,一看就知道对应的是什么环境变量,假设你要对$_GET['huanggy']进行FILTER_VALIDATE_INT过滤,可以这样
<?php
fileter_input(INPUT_GET,'huanggy',FILTER_VALIDATE_INT);
?>
filter_input_array()和filter_input()的关系相当于前面说的filter_var()和filter_var_array()的关系。
filter_list()可以获取所有支持的内置过滤器的NAME
扩展
如果filter内置的过滤器都满足不了你,怎么办?Filter的内置过滤器中有一个叫FILTER_CALLBACK的,这个过滤器额可以帮组你
<?php
functionmyfilter($str){
returnstr_replace('9','5',$str);
}
classMyFilter{
publicfunctionfilter1($str){
returnstr_replace('9','6',$str);
}
}
echofilter_var('wo9w9w9',FILTER_CALLBACK,array('options'=>'myfilter'));
echofilter_var('wo9w9w9',FILTER_CALLBACK,array('options'=>array('MyFilter','filter1')));
?>
通过这种方式,就可以自定义一个过滤规则,通过FILTER_CALLBACK过滤器来过滤了