PHP强大的内置filter

//type 外来变量类型
INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER或 INPUT_ENV之一。

//验证(validation) Filters
FILTER_VALIDATE_BOOLEAN:  把值作为布尔选项来验证,对 "1", "true", "on" 和 "yes" 返回 TRUE, 其余的都返回 FALSE
FILTER_VALIDATE_EMAIL:    把值作为邮件地址来验证
FILTER_VALIDATE_FLOAT:    把值作为浮点数来验证
FILTER_VALIDATE_INT:      以整数验证值,可以选择范围
FILTER_VALIDATE_IP:       把值作为 IP 进行验证
FILTER_VALIDATE_REGEXP:   根据兼容 Perl 的正则表达式来验证值
FILTER_VALIDATE_URL:      把值作为 URL 进行验证

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

filter_var函数,先看下函数原型:
mixed filter_var ( mixed $variable [, int $filter [, mixed $options ]] )
$variable——要过滤的变量
$filter——要过滤的类型ID常量
$options——过滤类型参数

 

filter_input函数:
mixed filter_input ( int $type , string $variable_name [, int $filter [, mixed $options ]] )

第一个$type参数。该参数用于设置要过滤变量所在的数组,也就相当于:post方式过来的保存在$_POST数组中;get方式过 来的保存在$_GET数组中一样。它也是通过预定义常量进行设置的,如:post对应INPUT_POST,get对应INPUT_GET等。

实例

<?php
#PHP内置的validate filter
$input_data = True;
$result = filter_var($input_data,FILTER_VALIDATE_BOOLEAN);
#FILTER_VALIDATE_BOOLEAN对应验证布尔值
var_dump($result); #因为input_data是真,所以结果是 True
$input_data = 123;
$result = filter_var($input_data,FILTER_VALIDATE_BOOLEAN);
var_dump($result); #因为input_data是123数字类型,所以结果是 False
/*
filter_var 函数有三个参数 分别是 输入数据 filter对应的id 和选项
输入数据类型可以是多种的
filter的对应id在这里可以查看列表 http://www.php.net/manual/zh/filter.filters.php
选项是一个关联数组 可以在上面的地址中查看可以使用的选项,也可以自己使用回调函数来处理输入数据
*/
#使用回调例子
function callback_filter($value) #回调函数
{
return $value.'_callback';
}
$result = filter_var('input',FILTER_CALLBACK,array('options'=>'callback_filter'));
var_dump($result);
#验证一个非10进制的整数
#8进制
$result = filter_var('0755', FILTER_VALIDATE_INT, array('flags'=>FILTER_FLAG_ALLOW_OCTAL));
var_dump($result);
#16进制
$result = filter_var('0XAF', FILTER_VALIDATE_INT, array('flags'=>FILTER_FLAG_ALLOW_HEX));
var_dump($result);
#注意这里输出的结果是10进制的
#当验证失败时设置默认值  因为字符a不是整数,所以在无法通过验证的时候被强制替换成了默认值123 
$result = filter_var('a',FILTER_VALIDATE_INT,array('options'=>array('default'=>123)));
var_dump($result);
#限制数字范围
$result = filter_var(99,FILTER_VALIDATE_INT,array('options'=>array('default'=>50,'max_range'=>98)));
var_dump($result);
$result = filter_var(99,FILTER_VALIDATE_INT,array('options'=>array('default'=>50,'min_range'=>100)));
var_dump($result);
#min与max可以同时使用
#验证email格式
$result = filter_var('a@a.c',FILTER_VALIDATE_EMAIL);
var_dump($result);
#验证IP
$result = filter_var('192.168.1.1',FILTER_VALIDATE_IP);
var_dump($result);
#FILTER_VALIDATE_IP的flags有四个分别是
#FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE
#对应 IPV4 IPV6 过滤私有地址 与 过滤保留地址
#验证url
$result = filter_var('http://www.yahoo.com/',FILTER_VALIDATE_URL);
var_dump($result);
#url 有两种flags 其中FILTER_FLAG_QUERY_REQUIRED 要求url中必须包含查询字符串
#FILTER_FLAG_PATH_REQUIRED 要求格式必须包含为/结尾的路径或者包含文件
#简单来说就是 http://aaa.com是不能通过的 但是http://aaa.com/或者http://aaa.com/index.html就可以通过)
#注意 url并不仅限于http与https ,而且目前也只支持ASCII字符,例如中文域名就会失败
#根据正则验证
$result = filter_var('0000112884634874',FILTER_VALIDATE_REGEXP,array('options'=>array('regexp'=>"/\d+/")));
var_dump($result);
#在php 5.4.11之前 +0与-0只能通过float验证,在5.4.11之后可以通过int和float验证
#以上就是PHP内置的几种validate filter,下回介绍其他filter


#Sanitize filters
#Sanitize filters 可以清理掉不规范的字符
# FILTER_SANITIZE_EMAIL 可以清理除了 字母和数字 以及  !#$%&'*+-/=?^_`{|}~@.[] 以外的字符  (感觉没什么用啊)
$result = filter_var('这里是一个email地址asdjaslkd@sdjkasdj.com',FILTER_SANITIZE_EMAIL);
var_dump($result);
# FILTER_SANITIZE_ENCODED 处理URL编码 有4个flags
# FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
# FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
# FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
# 感觉还是urlencode函数更实用
$result = filter_var('http://www.longxiao7.com',FILTER_SANITIZE_ENCODED);
var_dump($result);
# FILTER_SANITIZE_MAGIC_QUOTES  等同于  addslashes 函数
# FILTER_SANITIZE_NUMBER_FLOAT 删除浮点数中所有非法的字符 此FILTER可能存在的flags如下
# FILTER_FLAG_ALLOW_FRACTION  允许小数部分
# FILTER_FLAG_ALLOW_THOUSAND  允许千分位计数
# FILTER_FLAG_ALLOW_SCIENTIFIC 允许科学计数
$result = filter_var('0.54548',FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
var_dump($result);
$result = filter_var('1000,000,000',FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_THOUSAND);
var_dump($result);
$result = filter_var('1E20',FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_SCIENTIFIC);
var_dump($result);
# FILTER_SANITIZE_NUMBER_INT 过滤整数以外的字符
$result = filter_var('54548)*)(……&*%6554……¥测试字符.055',FILTER_SANITIZE_NUMBER_INT);
var_dump($result);
# FILTER_SANITIZE_SPECIAL_CHARS  处理HTML转义字符 '"<>& 以及 ASCII 值小于 32 的字符
# flags
# FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
# FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
$result = filter_var('<script>alert(\'&nbsp;中文\')</script>',FILTER_SANITIZE_SPECIAL_CHARS);
var_dump($result);
# FILTER_SANITIZE_FULL_SPECIAL_CHARS 上面那个加强版?貌似和htmlspecialchars函数是一样的
#FILTER_SANITIZE_STRING 过滤器去除或编码不需要的字符。
# flags
# FILTER_FLAG_NO_ENCODE_QUOTES - 该标志不编码引号
# FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
# FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
# FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_AMP - 把 & 字符编码为 &amp;
$result = filter_var('<script>alert(\'&nbsp;中文\')</a>',FILTER_SANITIZE_STRING,FILTER_FLAG_ENCODE_AMP);
var_dump($result);
# FILTER_SANITIZE_URL 可以清理除了 字母和数字 以及 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=以外的字符
# FILTER_UNSAFE_RAW 感觉意义不大,需要配合flags才能工作 详见PHP手册

 

转载于:https://my.oschina.net/u/1269381/blog/1563210

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值