PHP中filter函数校验数据的方法详解
介绍PHP中filter函数校验数据的方法详解,PHP过滤器包含两种类型:Validation用来验证验证项是否合法
、Sanitization用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除。
input_filters_list()
用来列出当前系统所支持的所有过滤器。
复制代码>复制代码<\/a>代码如下:
<?php
foreach(filter_list()as$id=>$filter)
{
echo$filter.''.filter_id($filter)."\n";
}
?>
以上代码会输出如下信息
FilterNameFilterID int257 boolean258 float259 validate_regexp272 validate_url273 validate_email274 validate_ip275 string513 stripped513 encoded514 special_chars515 full_special_chars522 unsafe_raw516 email517 url518 number_int519 number_float520 magic_quotes521 callback1024
每个过滤器都会拥有一个独自的ID。这里的每个过滤器都能够被filter_var()函数使用。下面将会逐个介绍其使用方法。注意,上面的string和strippedID相同,这是因为他们是同一个过滤器,或者说是同一个过滤器的两个别名罢了。
过滤数据
使用filter_var()方法对数据进行过滤,下面是一个简单的过滤例子
复制代码>复制代码<\/a>代码如下:
<?php
/***anintegertocheck***/
$int=1234;
/***validatetheinteger***/
echofilter_var($int,FILTER_VALIDATE_INT);
//1234
?>
上面代码将会数据一个整数型的1234,因为$int变量通过的整数类型的验证,这次更换一下$int变量的内容
复制代码>复制代码<\/a>代码如下:
<?php
/***anintegertocheck***/
$int='abc1234';
/***validatetheinteger***/
echofilter_var($int,FILTER_VALIDATE_INT);
?>
此时在运行代码,发现没有任何变量输出,这是因为$in变量没有通过验证,因此这个方法返回bool(false)。同时也需要注意一下,即使$int=”,也会返回bool(false)
整数验证
上面的几段代码简单的验证了一个给定值是否为整数的例子。其实FILTER_VALIDATE_INT也提供了数值范围的验证,下面我们来验证一个变量,判断它是否为整数型,并验证它的值是否在50到100之间
<?php /***anintegertocheck***/ $int=42; /***lowerlimitoftheint***/ $min=50; /***upperlimitoftheint***/ $max=100; /***validatetheinteger***/ echofilter_var($int,FILTER_VALIDATE_INT,array("min_range"=>$min,"max_range"=>$max)); //42 ?>
运行上面的代码,发现42被输出来了,并没有发现任何错误,这是为什么啊?原来想要向验证中添加附加验证规则时候,需要传递一个含有'options‘键的数组,向下面这样:
复制代码>复制代码<\/a>代码如下:
<?php
/***anintegertocheck***/
$int=42;
/***lowerlimitoftheint***/
$min=50;
/***upperlimitoftheint***/
$max=100;
/***validatetheinteger***/
echofilter_var($int,FILTER_VALIDATE_INT,array("options"=>array("min_range"=>$min,"max_range"=>$max)));
?>
运行上面的代码,页面不会有任何输出,因为上面返回了false,说明验证成功。
使用该方法也可以对负数进行范围验证
同时这种方式也支持单范围取值,即只是指定一个最大值或者最小值的范围,如:
复制代码>复制代码<\/a>代码如下:
<?php
/***anintegertocheck***/
$int=12;
/***lowerlimitoftheint***/
$min=10;
/***validatetheinteger***/
echofilter_var($int,FILTER_VALIDATE_INT,array('options'=>array('min_range'=>$min)));
//12
?>
上述代码会验证$int是否是大于(不包括等于)$min的整数类型的值,运行代码,输出12
对一组变量进行验证
上面的这些例子只是简单的对单个值进行验证,那么如果对一组变量进行验证呢?答案是使用filter_var_array()。该函数可以同时验证多个不同类型的数据。这里先做一个简单的例子:
复制代码>复制代码<\/a>代码如下:
<?php
/***anarrayofvaluestofilter***/
$arr=array(10,"109","","-1234","sometext","asdf234asdfgs",array());
/***createanarrayoffilteredvalues***/
$filtered_array=filter_var_array($arr,FILTER_VALIDATE_INT);
/***printouttheresults***/
foreach($filtered_arrayas$key=>$value)
{
echo$key.'--'.$value.'<br/>';
}
?>
运行上述代码,输出如下:
复制代码>复制代码<\/a>代码如下:
0--10
1--109
2--
3---1234
4--
5--
6--Array
八进制和十六进制
FILTER_VALIDATE_INT过滤器同时支持八进制和十六进制,这两种flags是:
FILTER_FLAG_ALLOW_HEX
FILTER_FLAG_ALLOW_OCTAL
利用数组传递flags
复制代码>复制代码<\/a>代码如下:
<?php
/***ahexvaluetocheck***/
$hex="0xff";
/***filterwithHEXflag***/
echofilter_var($hex,FILTER_VALIDATE_INT,array("flags"=>FILTER_FLAG_ALLOW_HEX));
//255
?>
Boolean验证FILTER_VALIDATE_BOOLEAN
复制代码>复制代码<\/a>代码如下:
<?php
/***testforabooleanvalue***/
echofilter_var("true",FILTER_VALIDATE_BOOLEAN);
//1
?>
上面的代码输出1,因为过滤器发现了一个有效的布尔值,下面列出了其它可以返回true的值
复制代码>复制代码<\/a>代码如下:
1
“1”
“yes”
“true”
“on”
TRUE
下列值将会返回false
复制代码>复制代码<\/a>代码如下:
0
“0”
“no”
“false”
“off”
“”
NULL
FALSE
同时也支持下面的用法
复制代码>复制代码<\/a>代码如下:
<?php
/***asimplearray***/
$array=array(1,2,3,4,5);
/***testforabooleanvalue***/
echofilter_var(in_array(3,$array),FILTER_VALIDATE_BOOLEAN)?"TRUE":"FALSE";
//true
?>
在上面的代码中,先判断了in_array函数执行成功,返回了true,所以最后这段代码输出true
我们也可以传递一个数组,来判断数组中值的boolean类型
复制代码>复制代码<\/a>代码如下:
<?php
/***amultidimensionalarray***/
$array=array(0,1,2,3,4,array(0,1,2,3,4));
/***createthelistofvalues***/
$values=filter_var($array,FILTER_VALIDATE_BOOLEAN,FILTER_REQUIRE_ARRAY);
/***dumpthevalues***/
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
<?php /***anFLOATvaluetocheck***/ $float=22.42; /***validatewiththeFLOATflag***/ if(filter_var($float,FILTER_VALIDATE_FLOAT)===false) { echo"$floatisnotvalid!"; } else { echo"$floatisavalidfloatingpointnumber"; } ?>
对数组进行浮点型验证
同其它验证一样,也可以对一个数组进行浮点型验证。与boolean验证类似,提供一个flgsFILTER_REQUIRE_ARRAY。
<?php /***anarrayofvalues***/ $array=array(1.2,"1.7","","-12345.678","sometext","abcd4.2efgh",array()); /***validatethearray***/ $validation_array=filter_var($array,FILTER_VALIDATE_FLOAT,FILTER_REQUIRE_ARRAY); /***dumpthearrayofvalidateddata***/ 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){} }
浮点型过滤器支持我们指定一个数字间的分隔符
<?php /***anarrayoffloatswithseperators***/ $floats=array( "1,234"=>",", "1.234"=>"..", "1.2e3"=>"," ); /***validatethefloatsagainsttheuserdefineddecimalseperators***/ foreach($floatsas$float=>$dec_sep) { $out=filter_var($float,FILTER_VALIDATE_FLOAT,array("options"=>array("decimal"=>$dec_sep))); /***dumptheresults***/ var_dump($out); } ?>
在上面的代码中,$floats函数中第一个元素值为',',所以在判断1,234值时为其指定了分隔符为',',所以返回true
上面代码完整返回值
复制代码>复制代码<\/a>代码如下:
float(1.234)
Warning:filter_var()[function.filter-var]:decimalseparatormustbeonecharin/www/filter.phponline13
bool(false)
bool(false)
验证URLFILTER_VALIDATE_URL
URL的验证是一项很困难的行为,由于URL的不确定性,它没有最大长度的限制,而且它的格式是多样化的,你可以通过阅读RFC1738来了解有关URL的一些信息。之后你可以创建一个类来验证所有ipv4和ipv6的URL,以及一些其它URL的验证。你也可以简单的使用FILTER_VALIDATE_URL来验证URL。
<?php /***arfccompliantwebaddress***/ $url="http://www.phpro.org"; /***trytovalidatetheURL***/ if(filter_var($url,FILTER_VALIDATE_URL)===FALSE) { /***ifthereisnomatch***/ echo"Sorry,$urlisnotvalid!"; } else { /***ifwematchthepattern***/ echo"TheURL,$urlisvalid!<br/>"; } ?>
上面的例子中通过简单的if语句来判断给定的URL是否合法,但并不是所有的URL都是这样的格式。有时候URL可是能是一个IP地址,也可能在URL中传递了多个参数。下面提供了几个flags来帮助我们验证URL:
FILTER_FLAG_SCHEME_REQUIRED–要求URL是RFC兼容URL。(比如:http://cg.am>http://cg.am<\/a>)
FILTER_FLAG_HOST_REQUIRED–要求URL包含主机名(比如:http://levi.cg.com>http://levi.cg.com<\/a>)
FILTER_FLAG_PATH_REQUIRED–要求URL在主机名后存在路径(比如:http://levi.cg.am/test/phpmailer/>http://levi.cg.am/test/phpmailer/<\/a>)
FILTER_FLAG_QUERY_REQUIRED–要求URL存在查询字符串(比如:http://levi.cg.am/?p=2618>http://levi.cg.am/?p=2618<\/a>)
<?php /***anonrfccompliantURL***/ $url="index.php"; /***trytovalidatetheURL***/ if(filter_var($url,FILTER_VALIDATE_URL,FILTER_FLAG_SCHEME_REQUIRED)===FALSE) { /***ifthereisnomatch***/ echo"Sorry,$urlisnotvalid!"; } else { /***iftheURLisvalid***/ echo"TheURL,$urlisvalid!"; } ?>
可以发现,上面的代码没有通过验证
IP过滤器FILTER_VALIDATE_IP
FILTER_VALIDATE_IP过滤器把值作为IP进行验证。
Name:“validate_ip”
ID-number:275
可能的标志:
FILTER_FLAG_IPV4–要求值是合法的IPv4IP(比如:255.255.255.255)
FILTER_FLAG_IPV6–要求值是合法的IPv6IP(比如: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过滤器把值作为电子邮件地址来验证。
<?php $email="someone@example.com"; if(!filter_var($email,FILTER_VALIDATE_EMAIL)) { echo"E-mailisnotvalid"; } else { echo"E-mailisvalid"; } ?>
自定义过滤器FILTER_CALLBACK
FILTER_CALLBACK过滤器使用用户自定义函数对值进行过滤。
这个过滤器为我们提供了对数据过滤的完全控制。
指定的函数必须存入名为“options”的关联数组中。
<?php $email="someone@example.com"; if(!filter_var($email,FILTER_VALIDATE_EMAIL)) { echo"E-mailisnotvalid"; } else { echo"E-mailisvalid"; } ?>
输出
复制代码>复制代码<\/a>代码如下:
Peter_is_a_great_guy!
以上所述就是本文全部内容,希望大家喜欢。