PHP 过滤器(Filter)用于验证和过滤来自非安全来源的数据,比如用户的输入,使用过滤器扩展可以使数据过滤更轻松快捷。要求的 PHP 版本是 PHP 5 >= 5.2.0,PHP 7

和 Filter 有关的函数包括

filter_has_var— 检测接收指定类型的变量是否存在,例如通过post传递的username变量是否存在
filter_id — 返回与某个特定名称的过滤器相关联的id
filter_input_array — 获取一系列外部变量,并且可以通过过滤器处理它们
filter_input — 通过名称获取特定的外部变量,并且可以通过过滤器处理它
filter_list — 返回所支持的过滤器列表
filter_var_array — 获取多个变量并且过滤它们
filter_var — 使用特定的过滤器过滤一个变量

其中

filter_input(int $type, string $variable_name [, int $filter = FILTER_DEFAULT] [, mixed $options])

参数 $type 可以是 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER 或 INPUT_ENV

参数 $filter 的类型可以参见 php 手册:http://php.net/manual/zh/filter.filters.php

使用 Filter 可以对表单必填域验证、数字验证、email 验证、下拉菜单验证、单选按钮验证、复选框验证等。

使用 Filter 可以节省很多正则,例如验证 email、INT、bool ,并且 filter_has_var 函数比 isset 函数要更快。

一、验证必填域

//检查$_POST['username']长度之前首先确保它存在
if(! (filter_has_var(INPUT_POST, 'username') && (strlen(filter_input(INPUT_POST, 'username')) > 0) )) {
echo '请输入用户名';
exit;
}

说明:filter_has_var 函数在接收到了变量时对变量的值进行验证,在该例中,如果接受到了 $_POST['username'] ,即对 $_POST['username'] 的值进行验证,如果没有接收到变量 $_POST['username'],例如该字段在表单中是单个的复选框,不勾选的话,处理的页面是接收不到该字段的信息的。

二、验证长度

//FILTER_SANITIZE_STRING过滤器会去除HTML标记、删除二进制非ASCII字符、并对与字符编码(&)
if(filter_has_var(INPUT_POST, 'country') && strlen(filter_input(INPUT_POST, 'country', FILTER_SANITIZE_STRING)) <=2) {
echo 'country长度不小于2个字符';
exit;
}

说明:

参数 FILTER_SANITIZE_STRING 用于去除 HTML 标记、删除二进制非 ASCII 字符、并且对与字符编码(&)

三、验证邮箱

//验证邮箱
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if($email === false) {
echo '请输入正确的邮箱';
exit;
}

说明:使用参数 FILTER_VALIDATE_EMAIL 验证 email

四、验证整数

//验证整数,如果填写了年龄则进行验证
if(strlen(filter_input(INPUT_POST, 'age')) > 0) {
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);
if($age === false) {
echo '请输入正确的年龄';
exit;
}
}

说明:使用参数FILTER_VALIDATE_INT  验证整数

五、验证小数

//验证小数,如果填写了salary则进行验证
if(strlen(filter_input(INPUT_POST, 'salary')) > 0) {
$salary = filter_input(INPUT_POST, 'salary', FILTER_VALIDATE_FLOAT);
if($salary === false) {
echo '请输入正确的薪资';
exit;
}
}

说明:使用参数 FILTER_VALIDATE_FLOAT 验证浮点数

六、验证数组,复选框验证组

//确保$_POST['sports']存在且是一个数组
if(! (filter_has_var(INPUT_POST, 'sports') && filter_input(INPUT_POST, 'sports', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY))) {
echo '请选择一项运动';
exit;
} //验证复选框组
//array_intersect 计算数组的交集
if(array_intersect($_POST['sports'], array_values($sports)) != $_POST['sports']) {
echo '请选择正确的运动';
exit;
}

说明:使用参数 FILTER_DEFAULT 进行占位,使用参数 FILTER_REQUIRE_ARRAY 验证是否是数组

使用 array_intersect 函数计算数组的交集

七、验证单个复选框

//验证单个复选框
if(filter_has_var(INPUT_POST, 'single')) {
if($_POST['single'] == $value) {
$single = true;
} else {
$single = false;
echo '错误的提交';
exit;
}
}

八、验证下拉菜单

//验证下拉菜单
if(! (filter_has_var(INPUT_POST, 'food') && array_key_exists($_POST['food'], $choices))) {
echo '请选择喜欢的食物';
exit;
}

九、验证单选按钮

//验证性别
if(! (filter_has_var(INPUT_POST, 'sex') && in_array($_POST['sex'], $sex))) {
echo '请选择性别';
exit;
}

十、验证时间

//验证时间
if(filter_has_var(INPUT_POST, 'time')) {
foreach($_POST['time'] as $time) {
@list($year, $month, $day) = explode('-', $time);
if(! @checkdate($month, $day, $year)) {
echo '时间错误';
exit;
}
//时间段验证(略)
}
}

说明:使用 checkdate 函数验证是否是正确的时间

完整代码:

<?php

    header('Content-type:text/html;charset=utf-8');

    //下拉菜单 value=>choice
$choices = ['Eggs'=>'Eggs Benedict', 'toast'=>'Buttered Toast with jam', 'coffee'=>'piping hot coffee'];
//单选按钮 choice=>value
$sex = ['male'=>1, 'femail'=>2];
$defaults['sex'] = 'male';
//单个复选框
$value = 'yes';
//复选框组 choice=>value
$sports = ['足球'=>'football', '跑步'=>'run', '壁球'=>'wall_ball']; if($_SERVER['REQUEST_METHOD'] == 'GET') {
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script language="javascript" type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
</head>
<body>
<form action="<?php echo htmlentities($_SERVER['SCRIPT_NAME']);?>" method="post">
<table>
<tr>
<td>name:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>country:</td>
<td><input type="text" name="country"></td>
</tr>
<tr>
<td>email:</td>
<td><input type="text" name="email"></td>
</tr>
<tr>
<td>age:</td>
<td>
<input type="text" name="age">
</td>
</tr>
<tr>
<td>salary:</td>
<td>
<input type="text" name="salary">
</td>
</tr>
<tr>
<td>food:</td>
<td>
<?php echo "<select name='food'>\n";
echo "<option value='0'>请选择喜欢的食物:</option>\n";
foreach($choices as $key=>$choice) {
echo "<option value='".$key."'>".$choice."</option>\n";
}
echo "</select>";
?>
</td>
</tr>
<tr>
<td>sex:</td>
<td>
<?php
foreach($sex as $key=>$choice) {
echo "<input type='radio' name='sex' value='".$choice."'";
if($defaults['sex'] == $key) {
echo "checked='checked'";
}
echo ">".$key."\n";
}
?>
</td>
</tr>
<tr>
<td colspan="2">
<?php
foreach($sports as $key=>$choice) {
echo "<input type='checkbox' name='sports[]' value='".$choice."'>".$key."\n";
}
?>
</td>
</tr>
<tr>
<td>
是否单身:
</td>
<td>
<?php
echo "<input type='checkbox' name='single' value='yes'>";
?>
</td>
</tr>
<tr>
<td>
工作起始时间:
</td>
<td>
<input class="Wdate" type="text" name="time[]" onClick="WdatePicker()">

<input class="Wdate" type="text" name="time[]" onClick="WdatePicker()">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>
</body>
</html>
<?php
} else {
//严格表单认证
//检查$_POST['username']长度之前首先确保它存在
if(! (filter_has_var(INPUT_POST, 'username') && (strlen(filter_input(INPUT_POST, 'username')) > 0) )) {
echo '请输入用户名';
exit;
} //$_POST['country']是可选的,不过如果提供了country字段,则保证在处理后要多于5个字符
//FILTER_SANITIZE_STRING过滤器会去除HTML标记、删除二进制非ASCII字符、并对与字符编码(&)
if(filter_has_var(INPUT_POST, 'country') && strlen(filter_input(INPUT_POST, 'country', FILTER_SANITIZE_STRING)) <=2) {
echo 'country长度不小于2个字符';
exit;
} //验证邮箱
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if($email === false) {
echo '请输入正确的邮箱';
exit;
} //确保$_POST['sports']存在且是一个数组
if(! (filter_has_var(INPUT_POST, 'sports') && filter_input(INPUT_POST, 'sports', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY))) {
echo '请选择一项运动';
exit;
} //验证复选框组
//array_intersect 计算数组的交集
if(array_intersect($_POST['sports'], array_values($sports)) != $_POST['sports']) {
echo '请选择正确的运动';
exit;
} //验证单个复选框
if(filter_has_var(INPUT_POST, 'single')) {
if($_POST['single'] == $value) {
$single = true;
} else {
$single = false;
echo '错误的提交';
exit;
}
} //验证整数,如果填写了年龄则进行验证
if(strlen(filter_input(INPUT_POST, 'age')) > 0) {
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);
if($age === false) {
echo '请输入正确的年龄';
exit;
}
} //验证小数,如果填写了salary则进行验证
if(strlen(filter_input(INPUT_POST, 'salary')) > 0) {
$salary = filter_input(INPUT_POST, 'salary', FILTER_VALIDATE_FLOAT);
if($salary === false) {
echo '请输入正确的薪资';
exit;
}
} //验证下拉菜单
if(! (filter_has_var(INPUT_POST, 'food') && array_key_exists($_POST['food'], $choices))) {
echo '请选择喜欢的食物';
exit;
} //验证性别
if(! (filter_has_var(INPUT_POST, 'sex') && in_array($_POST['sex'], $sex))) {
echo '请选择性别';
exit;
} //验证时间
if(filter_has_var(INPUT_POST, 'time')) {
foreach($_POST['time'] as $time) {
@list($year, $month, $day) = explode('-', $time);
if(! @checkdate($month, $day, $year)) {
echo '时间错误';
exit;
}
//时间段验证(略)
}
} echo 'Hello, ',$_POST['username'];
var_dump($_POST);
}
?>

参考:

<PHP Cookbook>,3rd

php.net:http://php.net/manual/zh/book.filter.php

w3school:http://www.w3school.com.cn/php/php_filter.asp

使用 PHP 过滤器(Filter)进行严格表单验证的更多相关文章

  1. angularJS 过滤器 表单验证

    过滤器1.filter的作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果,主要用于数据的格式化.2.内置过滤器(1)Currency(货币)将一个数值格式化为货币格式,默认为$(2)D ...

  2. AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)

    这一节相对来说需要理解的东西不是太多,记住了那些api就行了. 还是一个案例(同样来自miaov),一个表单验证,先上代码,然后再对对应的内容进行解释. <!DOCTYPE html> & ...

  3. MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框

    1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...

  4. AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)

    一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...

  5. 从浅入深剖析angular表单验证

    最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. 入门之前,我觉得应该先了 ...

  6. 再说表单验证,在Web Api中使用ModelState进行接口参数验证

    写在前面 上篇文章中说到了表单验证的问题,然后尝试了一下用扩展方法实现链式编程,评论区大家讨论的非常激烈也推荐了一些很强大的验证插件.其中一位园友提到了说可以使用MVC的ModelState,因为之前 ...

  7. Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)

    通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...

  8. angular中的表单验证

    angular中的表单验证很强大, 一共有5中验证信息,$valid,$invalid,$pristine,$dirty,$error. $valid-----当验证通过的时候,为true,不通过的时 ...

  9. html表单验证程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. php--yii框架表单验证

    在视图层利用表单小部件生成表单时,field只能是数据库中存在的, 例如: use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\capt ...

随机推荐

  1. input(file)样式修改及上传文件名显示

    实现思路: a标签包裹input元素 设置a标签为上传按钮的样式,相对定位 设置input为透明,绝对定位,覆盖到a上面 效果:看到的按钮是a的样式,点击时实际是点击input元素.样式和功能都具备 ...

  2. 密码备忘录(Android) 开发笔记

    2015-10-28 功能: 1.注册[Ok],登陆[Ok],密码重置,找回密码 2.增加密码记录[ok],删除,修改,同步云 3.支持导入导出 代码仓库选择 BitBucket[change] 20 ...

  3. 报错注入分析之(count()、rand()、group by)分析,被大佬称为floor报错注入

    PS:在这几天的学习当中很多的文章都将此注入方式称之为“floor报错分析”但经过我这几天的学习.个人觉得不该如此称呼!若君有意请详细阅读此篇文章.特别感谢米怀特的开导,说句实在的研究这个注入有四天了 ...

  4. espcms列表页ajax无限加载

    类似百度图片的效果,滚动到底部后,点击加载更多,加载出第二页,第三页... 替代了传统的上一页,下一页,第几页,以达到在某些情况下使得用户体验更好. 二次开发方法: 1.先在模板文件中增加ajax文件 ...

  5. 【krpano】高德地图导航插件(源码+介绍+预览)

    简介 krpano可以利用js调用第三方网页版地图,因此可以实现导航效果,用来帮助用户导航到我们全景所在的位置. 效果截图如下,在手机端点击左侧按钮,便会对用户进行定位,跳转至高德地图进行导航     ...

  6. 守护神 Supervisor

    参考: http://linbo.github.io/2013/04/04/supervisor/ http://www.restran.net/2015/10/04/supervisord-tuto ...

  7. loadrunner11录制无法打开IE浏览器

    安装loadrunner折腾了很久,后来发现是ghost系统问题.重装了系统,再重装了自己需要用的工具~ 接着学习loadrunner,一边看帮助文档一遍学.可是为嘛按照帮助文档的步骤来,就是会碰到一 ...

  8. 2016ACM/ICPC亚洲区沈阳站-重现赛赛题

    今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...

  9. Emmet,让你爱上敲代码

    原文链接:http://m.blog.csdn.net/article/details?id=53484535 不错 —— 由 都不要欺负我 分享 Emmet 是一个可用在许多流行文本编辑器上的极大简 ...

  10. iOS 应用数据存储方式(XML属性列表-plist)

    iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...