PHP扩展之Filter过滤器详解【附验证内网IP实例代码】

blogdaren 2015-07-13 抢沙发 3849人次

简介

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

安装

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

使用

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

[php]
  1. <?php  
  2. $email1 'huanggy@example.org' 
  3. $email2 "example.org" 
  4. $email3 "(huanggy@example.org)" 
  5. var_dump(filter_var($email1, FILTER_VALIDATE_EMAIL));  
  6. var_dump(filter_var($email2, FILTER_VALIDATE_EMAIL));  
  7. var_dump(filter_var($email3, FILTER_SANITIZE_EMAIL));  
  8. ?>  

执行上面的例子,你可以知道,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里面配置

[php] 
  1. <?php  
  2. $int 10;  
  3. var_dump(filter_var($int, FILTER_VALIDATE_INT)); 输出int(10)  
  4. $options array('options'=>array('min_range'=>15));  
  5. var_dump(filter_var($int, FILTER_VALIDATE_INT,$options));#输出bool(false)  
  6. ?>  

同样的整形变量10,在我第二个过滤器中加两个配置参数,最小值为15,10不满足这个条件,所以返回fasle,再看下面这个例子

[php] 
  1. <?php  
  2. $int '0xf' 
  3. var_dump(filter_var($int, FILTER_VALIDATE_INT)); 输出bool(false)  
  4. $options array('options'=>array('min_range'=>15),'flags'=>FILTER_FLAG_ALLOW_HEX);  
  5. 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] 
  1. <?php  
  2. error_reporting(E_ALL E_STRICT);  
  3. $data array 
  4.     'product_id'    => 'libgd<script>' 
  5.     'component'     => '10' 
  6.     'versions'      => '2.0.33' 
  7.     'testscalar'    => array('2''23''10''12'),  
  8.     'testarray'     => '2' 
  9. );  
  10.   
  11. $args array 
  12.     'product_id'   => FILTER_SANITIZE_ENCODED,  
  13.     'component'    => array('filter'    => FILTER_VALIDATE_INT,  
  14.                             'flags'     => FILTER_FORCE_ARRAY,   
  15.                             'options'   => array('min_range' => 1, 'max_range' => 10)  
  16.                            ),  
  17.     'versions'     => FILTER_SANITIZE_ENCODED,  
  18.     'doesnotexist' => FILTER_VALIDATE_INT,  
  19.     'testscalar'   => array 
  20.                             'filter' => FILTER_VALIDATE_INT,  
  21.                             'flags'  => FILTER_REQUIRE_SCALAR,  
  22.                            ),  
  23.     'testarray'    => array 
  24.                             'filter' => FILTER_VALIDATE_INT,  
  25.                             'flags'  => FILTER_FORCE_ARRAY,  
  26.                             
  27.   
  28. );  
  29.   
  30. $myinputs filter_var_array($data$args);  
  31.   
  32. var_dump($myinputs);  
  33. 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] 
  1. <?php  
  2. 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]
  1. <?php  
  2. function myfilter($str){  
  3.     return str_replace('9''5'$str);  
  4.  
  5. class MyFilter{  
  6.     public function filter1($str){  
  7.         return str_replace('9''6'$str);  
  8.      
  9.  
  10. echo filter_var('wo9w9w9', FILTER_CALLBACK,array('options'=>'myfilter'));  
  11. echo filter_var('wo9w9w9', FILTER_CALLBACK,array('options'=>array('MyFilter','filter1')));   

通过这种方式,就可以自定义一个过滤规则,通过FILTER_CALLBACK过滤器来过滤了 


======================验证内网IP实例代码开始=================

class Helper_Tool
{
    /**  
     * 判断IP是否为私有IP或系统保留IP
     *
     * @param  string  $ip
     *
     * @return boolean 
     */
    static public function isPrivateIP($ip) 
    {    
        return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
    }    
}

======================验证内网IP实例代码结束=================

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:PHP扩展之Filter过滤器详解【附验证内网IP实例代码】

发表评论:

您的昵称:
电子邮件:
个人主页:

Free Web Hosting