PHP扩展之Filter详解

简介

 

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

安装


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

 

使用

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

 

<?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则是对变量的内容进行净化,把不负责规则的内容都清除,然后返回清除后的结果。

options参数的使用

 

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

 

注意:$options参数是一个数组,包含两个元素:选项options(数组)和标记flags。若是只有flags元素,则也可以直接传递而不用数组。

选项options为一数组。数组关键字必须为:选项名称。比如FILTER_VALIDATE_INT中的选项名称有min_range、max_range;FILTER_VALIDATE_FLOAT中的选项名称有decimal,FILTER_VALIDATE_REGEXP中的选项名称有regexp。数组值根据选项名称由用户定义。比如min_range表示最小值过滤。比如:$options = array('options'=>array('min_range'=>3));那么小于3的数字将无法通过验证。

实例:

<?php
$options = array();
$options['options']['min_range'] = 1;
$options['options']['max_range'] = 10;
$options['flags'] = FILTER_FLAG_ALLOW_OCTAL;
filter_var(3, FILTER_VALIDATE_INT, $options);
?>


实例

<?php
$foo = '256';
$bar = '0x100';
var_dump(validate_int($foo)); // false, too large
var_dump(validate_int($bar)); // false, too large
function validate_int($input){
  return filter_var(
    $input,
    FILTER_VALIDATE_INT,
    // We must pass an associative array
    // to include the range check options.
    array(
      'flags'   => FILTER_FLAG_ALLOW_HEX,
      'options' => array('min_range' => 1, 'max_range' => 0xff)
    )
  );
}
?>


实例

<?php
echo "|asdf".chr(9).chr(128)."_123|";
echo "\n";
// "bitwise conjunction" means logic OR / bitwise |
echo filter_var("|asdf".chr(9).chr(128)."_123\n|" ,FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);

/*
Results:
|asdf    �_123|
|asdf_123|
*/
?>

 

不得不说FILTER_VALIDATE_REGEXP 过滤器

如果系统自带的验证过滤器无法满足现实需要,我们可以通过FILTER_VALIDATE_REGEXP 过滤器来对数据进行验证。

<?php
//比如查询关键字,要排除'、"、<、>、=字符,并限定关键字长度
if(!filter_input(INPUT_GET,'keyword',FILTER_VALIDATE_REGEXP,array("options"=>array("regexp"=>"/^(^('|\"|<|>|=){1,30})/"))))
  exit('关键字不符合要求');
else
  echo 'vaild';
?>


 

PHP FILTER_CALLBACK 过滤器

定义和用法:FILTER_CALLBACK 过滤器使用用户自定义函数对值进行过滤。这个过滤器为我们提供了对数据过滤的完全控制。

指定的函数必须存入名为 "options" 的关联数组中。

Name: "callback"
ID-number: 1024
提示和注释
提示:您可以创建自己的函数,或者使用已有的 PHP 函数。

请参见下面的例子。

例子 1:调用自定义函数

<?php
function convertSpace($string){
 return str_replace(" ", "_", $string);
}
$string = "Peter is a great guy!";
echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));
?>

输出:Peter_is_a_great_guy!

例子 2:调用系统函数

<?php
$string="Peter is a great guy!";
echo filter_var($string, FILTER_CALLBACK,array("options"=>"strtoupper"));
?>

输出:PETER IS A GREAT GUY!

例子 3:调用类方法

<?php
class MyFilter{
  public function filter1($str){
    return str_replace('9','6',$str);
  }
}
echo filter_var('wo9w9w9',FILTER_CALLBACK,array('options'=>array('MyFilter','filter1')));//调用类方法
?>

 

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

 

过滤器资料查阅

请访问以下地址查阅:

1、http://www.54chen.com/p/intro.filter.html

2、http://www.w3school.com.cn/php/php_ref_filter.asp

3、http://cn2.php.net/manual/en/book.filter.php

 

本文参考:

http://blog.csdn.net/huanggy001/article/details/6149478

http://www.jb51.net/article/24532.htm

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值