zoukankan      html  css  js  c++  java
  • php 拓展 Filter 过滤器

    • 简介      

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

    • 安装

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

    • 使用

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

      

    <?php
    /**
     * 首先测试filter_var函数
     */
    $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));//净化过滤器
    ?> 
    结果:string(19) "huanggy@example.org" bool(false) string(19) "huanggy@example.org"

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

    filter扩展内置的函数有filter_var($var,[$filter,[$options]])  使用过滤器$filter过滤$var变量,如果$filter可以使用配置参数,可以第三个参数$options里面配置

    $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));
    $option = array('option' => array('min_range' => 15, 'flag' => FILTER_FLAG_ALLOW_HEX));  //flag 表示支持16进制 且最小数值为 15
    var_dump(filter_input($int, FILTER_VALIDATE_INT, $option));

    默认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<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);
    echo '<pre>';
    var_dump($myinputs);
    print_r($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  
    function myfilter($str) {    return str_replace('9', '5', $str);}
    class MyFilter {
        public static 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'))); ?>

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

     

     

  • 相关阅读:
    如何用RadioButton做一个底部的切换栏
    自定义有监听器的ScrollView
    ViewPager的使用小技巧
    什么时候用Application的Context,什么时候用Activity的Context
    让改变输入法回车键的图标
    墙内下载DropBox离线安装包的方法
    巧用用layer-list做一个卡片背景
    LeakCanary中英文文档+使用例子
    让你的APK瘦成一道闪电
    用一张图片实现按钮按下和普通效果的样式
  • 原文地址:https://www.cnblogs.com/timelesszhuang/p/4828219.html
Copyright © 2011-2022 走看看