【Filter】PHP扩展之Filter【原创】

1. 简介

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

PHP5.2之后的版本默认已经安装并且打开了。

例子:验证邮箱
  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. ?>
返回:
  1. string(19) "huanggy@example.org"
  2. bool(false)
  3. string(19) "huanggy@example.org"
可以发现:
filter_var($var,$filter)函数是使用过滤器$filter来过滤变量$var,而透过结果来分析,FILTER_VALIDATE_EMAIL过滤器只是验证变量$email是否负责过滤器规定的规则,符合要求则返回变量内容,不符合则返回false;
而FILTER_SANIZE_EMAIL则是对变量的内容进行净化,把不负责规则的内容都清除,然后返回清除后的结果。

2. 过滤器

验证过滤器有:
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


简单介绍一下:

验证过滤器:
  1. FILTER_VALIDATE_BOOLEAN: 把值作为布尔选项来验证,对 "1", "true", "on" "yes" 返回 TRUE 其余的都返回 FALSE
  2. FILTER_VALIDATE_EMAIL: 把值作为邮件地址来验证
  3. FILTER_VALIDATE_FLOAT: 把值作为浮点数来验证
  4. FILTER_VALIDATE_INT: 以整数验证值,可以选择范围
  5. FILTER_VALIDATE_IP: 把值作为 IP 进行验证
  6. FILTER_VALIDATE_REGEXP: 根据兼容 Perl 的正则表达式来验证值
  7. FILTER_VALIDATE_URL: 把值作为 URL 进行验证

净化过滤器:
  1. FILTER_SANITIZE_EMAIL: 移除所有字符, 除了字母,数字和 !#$%&'*+-/=?^_`{|}~@.[].
  2. FILTER_SANITIZE_ENCODED: 去除 URL 编码不需要的字符, 与 urlencode() 函数很类似
  3. FILTER_SANITIZE_MAGIC_QUOTES: 在指定的预定义字符前添加反斜杠, 单引号(')、双引号(")、反斜线(\)与 NULL
  4. FILTER_SANITIZE_NUMBER_FLOAT: 移除所有字符, 除了数字,+- 和可选(.,)
  5. FILTER_SANITIZE_NUMBER_INT: 移除所有字符, 除了数字和 +-
  6. FILTER_SANITIZE_SPECIAL_CHARS: 用于对 "<>& 以及 ASCII 值在 32 值以下的字符进行转义
  7. FILTER_SANITIZE_STRING: 删除那些对应用程序有潜在危害的数据。它用于去除标签以及删除或编码不需要的字符
  8. FILTER_SANITIZE_STRIPPED: 去除或编码不需要的字符,是 FILTER_SANITIZE_STRING 的别名
  9. FILTER_SANITIZE_URL: 移除所有字符, 除了字母,数字和 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
  10. FILTER_UNSAFE_RAW: 不进行任何过滤,去除或编码特殊字符


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

3. 例子

例子:验证数字
  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)
返回:
  1. int(10)
  2. bool(false)
同样的整形变量10,在我第二个过滤器中加两个配置参数,最小值为15,10不满足这个条件,所以返回fasle

例子:验证ip地址
  1. <?php
  2. $url = "192.168.1.110";
  3. $result = filter_var($url, FILTER_VALIDATE_IP);
  4. var_dump($result); // string(13) "192.168.1.110"
  5. // 该方法也可以用来验证ipv6。
  6. $url = "2001:DB8:2de::e13";
  7. $result = filter_var($url, FILTER_VALIDATE_IP);
  8. var_dump($result); // string(17) "2001:DB8:2de::e13"
  9. $url = "ipdizhi";
  10. $result = filter_var($url, FILTER_VALIDATE_IP);
  11. var_dump($result);
返回:
  1. string(13) "192.168.1.110"
  2. string(17) "2001:DB8:2de::e13"
  3. bool(false)

例子:验证url地址
  1. <?php
  2. $url = "http://www.fengdingbo.com";
  3. $result = filter_var($url, FILTER_VALIDATE_URL);
  4. var_dump($result); // string(25) "http://www.fengdingbo.com"
返回:
  1. string(25) "http://www.fengdingbo.com"

例子:验证邮箱地址
  1. <?php
  2. $email_a = 'onedayin2013@shawn.com';
  3. $email_b = 'invalid@email';
  4. $result = filter_var($email_a, FILTER_VALIDATE_EMAIL);
  5. var_dump($result);
  6. $result = filter_var($email_b, FILTER_VALIDATE_EMAIL);
  7. var_dump($result);
返回:
  1. string(22) "onedayin2013@shawn.com"
  2. bool(false)


虽然filter_var()函数提供了很多用于验证的标志,但这个函数不能验证所有的数据,除了filter_var函数之外,更推荐使用一些提供验证功能的组件:
aura/filter
respect/validation
symfony/validator






posted @ 2016-11-20 12:56  Newman·Li  阅读(302)  评论(0编辑  收藏  举报