PHP扩展之Filter详解
来源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"))); ?>
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。