PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。
什么是外部数据?
- 来自表单的输入数据
- Cookies
- Web services data
- 服务器变量
- 数据库查询结果
如需过滤变量,请使用下面的过滤器函数之一:
- filter_var() - 通过一个指定的过滤器来过滤单一的变量
- filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
- filter_input - 获取一个输入变量,并对它进行过滤
- filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("不是一个合法的整数"); } else { echo("是个合法的整数"); } ?>
有两种过滤器:
Validating 过滤器:
- 用于验证用户输入
- 严格的格式规则(比如 URL 或 E-Mail 验证)
- 如果成功则返回预期的类型,如果失败则返回 FALSE
Sanitizing 过滤器:
- 用于允许或禁止字符串中指定的字符
- 无数据格式规则
- 始终返回字符串
选项和标志
选项和标志用于向指定的过滤器添加额外的过滤选项。
不同的过滤器有不同的选项和标志。
<?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) ); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("不是一个合法的整数"); } else { echo("是个合法的整数"); } ?>
filter_has_var(INPUT_GET, "email")
filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)
- 检测是否存在 "GET" 类型的 "email" 输入变量
- 如果存在输入变量,检测它是否是有效的 e-mail 地址
!filter_has_var(INPUT_GET, "url")
$url = filter_input(INPUT_GET, "url", FILTER_SANITIZE_URL); echo $url;
- 如果存在此输入变量,对其进行净化(删除非法字符),并将其存储在 $url 变量中
假如输入变量是一个类似这样的字符串:"http://www.ruåånoøøob.com/",则净化后的 $url 变量如下所示:
http://www.runoob.com/
为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。
在本例中,我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一个名字、一个年龄以及一个 e-mail 地址:
$filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("年龄必须在 1 到 120 之间。<br>"); }
通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,
<?php $filter=array( 'min_range'=>12, 'max_range'=>32 ); $id =21; //判断地址栏是否存在email if(filter_has_var(INPUT_GET,'email')){ echo '存在email'; //验证email 这里验证的选项和标志可以分开写 if(filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)){ echo 'email合法'; } echo 111; if(filter_var($id,FILTER_VALIDATE_INT,$filter)){ echo '合法'; }else{ echo '不合法'; } } function change($string){ return str_replace('_','.',$string); } if(filter_has_var(INPUT_GET,'url')){ echo '存在'; if(filter_input(INPUT_GET,'url', FILTER_SANITIZE_URL)){ echo '过滤url成果'; if($rst=filter_var($_GET['url'],FILTER_CALLBACK,array('options'=>'change'))){ echo 'url成果'.$rst; } } } ?>