PHP过滤器包含两种类型

  • Validation:用来验证验证项是否合法
  • Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等。

input_filters_list()

用来列出当前系统所支持的所有过滤器。

1
2
3
4
5
6
<?php
foreach(filter_list() as $id => $filter)
{
   echo $filter.'    '.filter_id($filter)."\n";
}
?>

以上代码会输出如下信息

Filter Name Filter ID
int 257
boolean 258
float 259
validate_regexp 272
validate_url 273
validate_email 274
validate_ip 275
string 513
stripped 513
encoded 514
special_chars 515
full_special_chars 522
unsafe_raw 516
email 517
url 518
number_int 519
number_float 520
magic_quotes 521
callback 1024

每个过滤器都会拥有一个独自的ID。这里的每个过滤器都能够被filter_var()函数使用。下面将会逐个介绍其使用方法。注意 ,上面的string和strippedID相同,这是因为他们是同一个过滤器,或者说是同一个过滤器的两个别名罢了。

过滤数据

使用filter_var()方法对数据进行过滤,下面是一个简单的过滤例子

1
2
3
4
5
6
7
8
<?php
/*** an integer to check ***/
$int = 1234;
 
/*** validate the integer ***/
echo filter_var($int, FILTER_VALIDATE_INT);
//1234
?>

上面代码将会数据一个整数型的1234,因为$int变量通过的整数类型的验证,这次更换一下$int变量的内容

1
2
3
4
5
6
7
<?php
/*** an integer to check ***/
$int = 'abc1234';
 
/*** validate the integer ***/
echo filter_var($int, FILTER_VALIDATE_INT);
?>

此时在运行代码,发现没有任何变量输出,这是因为$in变量没有通过验证,因此这个方法返回bool(false)。同时也需要注意 一下,即使$int=”,也会返回bool(false)

整数验证

上面的几段代码简单的验证了一个给定值是否为整数的例子。其实FILTER_VALIDATE_INT也提供了数值范围的验证,下面我们 来验证一个变量,判断它是否为整数型,并验证它的值是否在50到100之间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/*** an integer to check ***/
$int = 42;
 
/*** lower limit of the int ***/
$min = 50;
 
/*** upper limit of the int ***/
$max = 100;
 
/*** validate the integer ***/
echo filter_var($int, FILTER_VALIDATE_INT, array("min_range" => $min, "max_range" => $max));
//42
?>

运行上面的代码,发现42被输出来了,并没有发现任何错误,这是为什么啊?原来想要向验证中添加附加验证规则时候,需要传递一个含有’options‘键的数组,向下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/*** an integer to check ***/
$int = 42;
 
/*** lower limit of the int ***/
$min = 50;
 
/*** upper limit of the int ***/
$max = 100;
 
/*** validate the integer ***/
echo filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range" => $min, "max_range" => $max)));
 
?>

运行上面的代码,页面不会有任何输出,因为上面返回了false,说明验证成功。

  • 使用该方法也可以对负数进行范围验证
  • 同时这种方式也支持单范围取值,即只是指定一个最大值或者最小值的范围,如:
1
2
3
4
5
6
7
8
9
10
11
<?php
/*** an integer to check ***/
$int = 12;
 
/*** lower limit of the int ***/
$min = 10;
 
/*** validate the integer ***/
echo filter_var($int, FILTER_VALIDATE_INT,array('options' => array('min_range' => $min)));
//12
?>

上述代码会验证$int是否是大于(不包括等于)$min的整数类型的值,运行代码,输出12

对一组变量进行验证

上面的这些例子只是简单的对单个值进行验证,那么如果对一组变量进行验证呢?答案是使用filter_var_array()。该函数可以同时验证多个不同类型的数据。这里先做一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/*** an array of values to filter ***/
$arr = array(10,"109","", "-1234", "some text", "asdf234asdfgs", array());
 
/*** create an array of filtered values ***/
$filtered_array = filter_var_array($arr, FILTER_VALIDATE_INT);
 
/*** print out the results ***/
foreach($filtered_array as $key => $value)
{
    echo $key.' -- '.$value.'<br />';
}
?>

运行上述代码,输出如下:

0 -- 10
1 -- 109
2 -- 
3 -- -1234
4 -- 
5 -- 
6 -- Array

八进制和十六进制

FILTER_VALIDATE_INT过滤器同时支持八进制和十六进制,这两种flags是:

  • FILTER_FLAG_ALLOW_HEX
  • FILTER_FLAG_ALLOW_OCTAL

利用数组传递flags

1
2
3
4
5
6
7
8
<?php
/*** a hex value to check ***/
$hex = "0xff";
 
/*** filter with HEX flag ***/
echo filter_var($hex, FILTER_VALIDATE_INT, array("flags" => FILTER_FLAG_ALLOW_HEX));
//255
?>

Boolean验证 FILTER_VALIDATE_BOOLEAN

1
2
3
4
5
<?php
/*** test for a boolean value ***/
echo filter_var("true", FILTER_VALIDATE_BOOLEAN);
//1
?>

上面的代码输出1,因为过滤器发现了一个有效的布尔值,下面列出了其它可以返回true的值

  • 1
  • “1”
  • “yes”
  • “true”
  • “on”
  • TRUE

下列值将会返回false

  • 0
  • “0”
  • “no”
  • “false”
  • “off”
  • “”
  • NULL
  • FALSE

同时也支持下面的用法

1
2
3
4
5
6
7
8
<?php
/*** a simple array ***/
$array = array(1,2,3,4,5);
 
/*** test for a boolean value ***/
echo filter_var(in_array(3, $array), FILTER_VALIDATE_BOOLEAN) ? "TRUE" : "FALSE";
//true
?>

在上面的代码中,先判断了in_array函数执行成功,返回了true,所以最后这段代码输出true
我们也可以传递一个数组,来判断数组中值的boolean类型

1
2
3
4
5
6
7
8
9
10
<?php
/*** a multi dimensional array ***/
$array = array(0, 1, 2, 3, 4, array(0, 1, 2, 3, 4));
 
/*** create the list of values ***/
$values = filter_var($array, FILTER_VALIDATE_BOOLEAN, FILTER_REQUIRE_ARRAY);
 
/*** dump the values ***/
var_dump($values);
?>

上面代码输出如下:

array(6) {
[0] => bool(false)
[1] => bool(true)
[2] => bool(false)
[3] => bool(false)
[4] => bool(false)
[5] => array(5) {
[0] => bool(false)
[1] => bool(true)
[2] => bool(false)
[3] => bool(false)
[4] => bool(false)
}
}

浮点型验证 FILTER_VALIDATE_FLOAT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/*** an FLOAT value to check ***/
$float = 22.42;
 
/*** validate with the FLOAT flag ***/
if(filter_var($float, FILTER_VALIDATE_FLOAT) === false)
{
    echo "$float is not valid!";
}
else
{
    echo "$float is a valid floating point number";
}
?>

对数组进行浮点型验证

同其它验证一样,也可以对一个数组进行浮点型验证。与boolean验证类似,提供一个flgs FILTER_REQUIRE_ARRAY。

1
2
3
4
5
6
7
8
9
10
<?php
/*** an array of values ***/
$array = array(1.2,"1.7","", "-12345.678", "some text", "abcd4.2efgh", array());
 
/*** validate the array ***/
$validation_array = filter_var($array, FILTER_VALIDATE_FLOAT, FILTER_REQUIRE_ARRAY);
 
/*** dump the array of validated data ***/
var_dump($validation_array);
?>

上面的代码输出如下

array(7) {
[0] => float(1.2)
[1] => float(1.7)
[2] => bool(false)
[3] => float(-23234.123)
[4] => bool(false)
[5] => bool(false)
[6] => array(0) { }
}

浮点型过滤器支持我们指定一个数字间的分隔符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/*** an array of floats with seperators ***/
$floats = array(
    "1,234" => ",",
    "1.234" => "..",
    "1.2e3" => ","
);
 
/*** validate the floats against the user defined decimal seperators ***/
foreach ($floats as $float => $dec_sep)
{
    $out = filter_var($float, FILTER_VALIDATE_FLOAT, array("options" => array("decimal" => $dec_sep)));
 
    /*** dump the results ***/
    var_dump($out);
}
?>

在上面的代码中,$floats函数中第一个元素值为’,’,所以在判断1,234值时为其指定了分隔符为’,’,所以返回true
上面代码完整返回值

float(1.234)
Warning: filter_var() [function.filter-var]: decimal separator must be one char in /www/filter.php on line 13
bool(false)
bool(false)

验证URL FILTER_VALIDATE_URL

URL的验证是一项很困难的行为,由于 URL的不确定性,它没有最大长度的限制,而且它的格式是多样化的,你可以通过阅读RFC 1738来了解有关URL的一些信息。之后你可以创建一个类来验证所有ipv4和ipv6的URL,以及一些其它URL的验证。你也可以简单的使用 FILTER_VALIDATE_URL来验证URL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
/*** a rfc compliant web address ***/
$url = "http://www.phpro.org";
 
/*** try to validate the URL ***/
if(filter_var($url, FILTER_VALIDATE_URL) === FALSE)
{
    /*** if there is no match ***/
    echo "Sorry, $url is not valid!";
}
else
{
    /*** if we match the pattern ***/
    echo "The URL, $url is valid!<br />";
}
?>

上面的例子中通过简单的if语句来判断给定的URL是否合法,但并不是所有的URL都是这样的格式。有时候URL可是能是一个IP地址,也可能在URL中传递了多个参数。下面提供了几个flags来帮助我们验证URL:

  • FILTER_FLAG_SCHEME_REQUIRED – 要求 URL 是 RFC 兼容 URL。(比如:http://yii.so)
  • FILTER_FLAG_HOST_REQUIRED – 要求 URL 包含主机名(比如:http://levi.cg.com)
  • FILTER_FLAG_PATH_REQUIRED – 要求 URL 在主机名后存在路径(比如:http://levi.yii.so/test/phpmailer/)
  • FILTER_FLAG_QUERY_REQUIRED – 要求 URL 存在查询字符串(比如:http://levi.yii.so/?p=2618)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
/*** a non rfc compliant URL ***/
$url = "index.php";
 
/*** try to validate the URL ***/
if(filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED) === FALSE)
{
    /*** if there is no match ***/
    echo "Sorry, $url is not valid!";
}
else
{
    /*** if the URL is valid ***/
    echo "The URL, $url is valid!";
}
?>

可以发现,上面的代码没有通过验证

IP过滤器 FILTER_VALIDATE_IP

FILTER_VALIDATE_IP 过滤器把值作为 IP 进行验证。
Name: “validate_ip”
ID-number: 275
可能的标志:

  • FILTER_FLAG_IPV4 – 要求值是合法的 IPv4 IP(比如:255.255.255.255)
  • FILTER_FLAG_IPV6 – 要求值是合法的 IPv6 IP(比如:2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
  • FILTER_FLAG_NO_PRIV_RANGE – 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
  • FILTER_FLAG_NO_RES_RANGE – 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。

Email过滤器FILTER_VALIDATE_EMAIL

FILTER_VALIDATE_EMAIL 过滤器把值作为电子邮件地址来验证。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$email = "someone@exa mple.com";
 
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
{
    echo "E-mail is not valid";
}
else
{
    echo "E-mail is valid";
}
?>

自定义过滤器 FILTER_CALLBACK

FILTER_CALLBACK 过滤器使用用户自定义函数对值进行过滤。
这个过滤器为我们提供了对数据过滤的完全控制。
指定的函数必须存入名为 “options” 的关联数组中。

1
2
3
4
5
6
7
8
9
10
11
<?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!

PHP Filter 函数

PHP:指示支持该函数的最早的 PHP 版本。

函数 描述 PHP
filter_has_var() 检查是否存在指定输入类型的变量。 5
filter_id() 返回指定过滤器的 ID 号。 5
filter_input() 从脚本外部获取输入,并进行过滤。 5
filter_input_array() 从脚本外部获取多项输入,并进行过滤。 5
filter_list() 返回包含所有得到支持的过滤器的一个数组。 5
filter_var_array() 获取多项变量,并进行过滤。 5
filter_var() 获取一个变量,并进行过滤。 5

PHP Filters

ID 名称 描述
FILTER_CALLBACK 调用用户自定义函数来过滤数据。
FILTER_SANITIZE_STRING 去除标签,去除或编码特殊字符。
FILTER_SANITIZE_STRIPPED “string” 过滤器的别名。
FILTER_SANITIZE_ENCODED URL-encode 字符串,去除或编码特殊字符。
FILTER_SANITIZE_SPECIAL_CHARS HTML 转义字符 ‘”<>& 以及 ASCII 值小于 32 的字符。
FILTER_SANITIZE_EMAIL 删除所有字符,除了字母、数字以及 !#$%&’*+-/=?^_`{|}~@.[]
FILTER_SANITIZE_URL 删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|//^~[]`<>#%”;/?:@&=
FILTER_SANITIZE_NUMBER_INT 删除所有字符,除了数字和 +-
FILTER_SANITIZE_NUMBER_FLOAT 删除所有字符,除了数字、+- 以及 .,eE。
FILTER_SANITIZE_MAGIC_QUOTES 应用 addslashes()。
FILTER_UNSAFE_RAW 不进行任何过滤,去除或编码特殊字符。
FILTER_VALIDATE_INT 在指定的范围以整数验证值。
FILTER_VALIDATE_BOOLEAN 如果是 “1”, “true”, “on” 以及 “yes”,则返回 true,如果是 “0”, “false”, “off”, “no” 以及 “”,则返回 false。否则返回 NULL。
FILTER_VALIDATE_FLOAT 以浮点数验证值。
FILTER_VALIDATE_REGEXP 根据 regexp,兼容 Perl 的正则表达式来验证值。
FILTER_VALIDATE_URL 把值作为 URL 来验证。
FILTER_VALIDATE_EMAIL 把值作为 e-mail 来验证。
FILTER_VALIDATE_IP 把值作为 IP 地址来验证

Sanitize filters

ID
(过滤器常量)
名称
(filter_list()函数返回的名称)
可用选项 标志位 描述
Validating
FILTER_VALIDATE_BOOLEAN “boolean”   FILTER_NULL_ON_FAILURE
难的数据为”1″,”true”,”on”,”yes”时返回true,否则返回false。当设置了FILTER_NULL_ON_FAILURE标志
位,则仅在值是”0″,”false”,”off”,”no”, 和””是返回false,其它非true值返回null。
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_OCTAL, 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 验证IP地址
FILTER_VALIDATE_REGEXP “validate_regexp” regexp   验证一个正则表达式
FILTER_VALIDATE_URL “validate_url”   FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED 验证一个URL
Sanitizing
FILTER_SANITIZE_EMAIL “email”     移除除英文字符,数字以及!#$%&’*+-/=?^_`{|}~@.[]之外的字符。
FILTER_SANITIZE_ENCODED “encoded”   FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH URL编码字符串,去除或编码指定字符串。
FILTER_SANITIZE_MAGIC_QUOTES “magic_quotes”     应用 addslashes()函数
FILTER_SANITIZE_NUMBER_FLOAT “number_float”   FILTER_FLAG_ALLOW_FRACTION, FILTER_FLAG_ALLOW_THOUSAND, FILTER_FLAG_ALLOW_SCIENTIFIC 移除除数字,+-以及.,eE以外的字符
FILTER_SANITIZE_NUMBER_INT “number_int”     移除除数字以及+-以外的字符
FILTER_SANITIZE_SPECIAL_CHARS “special_chars”   FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_HIGH HTML转义字符,'”&><以及 ASCII 值小于 32 的字符。以及其它指定的字符。
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”     Alias of “string” filter.
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 不做任何改变,或是按标志位去除或是编码指定字母。
FILTER_CALLBACK “callback”   FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP

用php自带的filter函数验证、过滤数据 -转载的更多相关文章

  1. PHP filter 函数FILTER_CALLBACK 过滤数据

    <?php function convertSpace($string) { return str_replace(" ", "_", $string); ...

  2. Python 内建的filter()函数用于过滤序列。

    例如,在一个list中,删掉偶数,只保留奇数,可以这么写: def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9 ...

  3. php自带的filter过滤函数

    PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. filter_has_var()检查是否存在指定输入类型的变量. filter_id()返回指定过滤器的 ID 号. filt ...

  4. PHP Filter 函数

    PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 Filter 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP Filte ...

  5. PHP Filter 函数 日常可用

    PHP Filter 函数 PHP Filesystem PHP FTP PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 filter 函数 ...

  6. PHP Filter函数

    PHP Filter 函数 PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 Filter 函数是 PHP 核心的组成部分.无需安装即可使用这 ...

  7. python基础——filter函数

    python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...

  8. Python自学笔记-filter()函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...

  9. 内置函数:filter函数

    功能: filter函数用于过滤序列,将满足条件的元素取出来构成新的序列. 用法: filter(function, iterable) 接受两个参数,第一个函数为过滤函数(返回True后者False ...

随机推荐

  1. 制作0.5px像素的细条

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  2. inno setup教程解释脚本

    inno setup教程解释脚本 2007-04-08 21:31:36|  分类: 科技-> Inno Setu |  标签:inno   |举报 |字号 订阅     下载LOFTER客户端 ...

  3. Magento:Paypal付款不成功返回后不要清空购物车产品的解决方案

    经常遇到这个问题,当我们使用第三方支付工具Gateway如paypal支付的时候,如果用户付款不成功或者取消了订单再返回网站时,发现购物车里面的产品已经被清空了,如果是客户主动cancel的还好,但是 ...

  4. Magento中,调用静态块的几种方法

    在后台创建一个order_form静态块Block Title :Order FormIdentifier :order_formStatus :EnabledContent :自定义内容 1.如果要 ...

  5. 转:DataTable.Compute()用法

    转自:http://www.cnblogs.com/fanyf/archive/2012/05/11/2495919.html一.DataTable.Compute()方法說明如下 作用: 计算用来传 ...

  6. Eclipse Pydev 技巧汇编

    之前一直使用eclipse中默认的console.但是这个console并不是interactive的,如果数据比较小的时候还行,数据量一旦很大,则每次调试都需要重新再跑一遍程序,从而浪费很多时间. ...

  7. iOS学习笔记---oc语言第五天

    字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key- ...

  8. Codeforces Round #373 (Div. 2) A B C 水 贪心 模拟(四舍五入进位)

    A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...

  9. html---文本框样式;

    一.一个单行文本框的例子 <form name="form1" action="mailto:3400982550@qq.com" method=&quo ...

  10. Vigenère 密码NOIP 2012 提高组 第一天 第一题

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...