PHP扩展之Filter详解

43 篇文章 0 订阅

来源URL:http://sys1029.blog.163.com/blog/static/54445719201302453630212/

简介

       Filter,它的作用就和他的名字一样——过滤。过滤规则成为过滤器,Filter内置了多个常用过滤器,根据过滤器功能的不同,可以分成净化过滤器(Sanitization)和验证过滤器(Validation)两种。两种的差别在于,净化过滤器会把被过滤的变量中不符合规则的东西清除掉,返回清除后的内容;而验证过滤器只是验证的功能,并不会去改变变量的值,如果符合过滤器的规则,则返回变量内容,否则返回false;
 安装

      Filter的安装很简单,如果是PHP5.2.0之后的版本,应该已经默认打开了,可以通过phpinfo()来查看。如果5.2.0之前的版本,可以使用PECL来使用Filter

 
使用

     使用filter来过滤或验证数据很简单,下面是一个简单的例子
[php] view plaincopy

    <?php  
    $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	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
[php] view plaincopy

    <?php  
    $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

再看下面这个例子
[php] view plaincopy

    <?php  
    $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来对应,看下面这个例子你可以很容易的明白这个函数的用图
[php] view plaincopy

    <?php  
    error_reporting(E_ALL | E_STRICT);  
    $data = array(  
        'product_id'    => 'libgd<script>',  
        '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] view plaincopy

    <?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] view plaincopy

    <?php  
    function myfilter($str){  
        return str_replace('9','5',$str);  
    }  
    class MyFilter{  
        public function filter1($str){  
            return str_replace('9','6',$str);  
        }  
    }  
    echo filter_var('wo9w9w9',FILTER_CALLBACK,array('options'=>'myfilter'));  
    echo filter_var('wo9w9w9',FILTER_CALLBACK,array('options'=>array('MyFilter','filter1')));  
    ?>  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值