比别人多一点执着,你就会创造奇迹 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

PHP中常用的过滤和验证函数及方法整理

开发 memory 发布于February 26, 2018 标签: 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

自带函数对应的验证变量:

ID名称描述
FILTER_CALLBACK调用用户自定义函数来过滤数据。
FILTER_SANITIZE_STRING去除标签,去除或编码特殊字符。
FILTER_SANITIZE_STRIPPED"string" 过滤器的别名。
FILTER_SANITIZE_ENCODEDURL-encode 字符串,去除或编码特殊字符。
FILTER_SANITIZE_SPECIAL_CHARSHTML 转义字符 '"<>& 以及 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 地址来验证。

内置函数的参数说明

filter_has_var(type, variable)

参数描述
type必需。规定要检查的类型。可能的值:INPUT_GET , INPUT_POST , INPUT_COOKIE , INPUT_SERVER , INPUT_ENV
variable必需。规定要检查的变量。

filter_id(filter_name)
必需。规定被获取 ID 号的过滤器。必须是过滤器名称(不是过滤器 ID 名)。
请使用 filter_list() 函数来获取所有被支持的过滤器的名称。

<?php 
echo(filter_id("validate_email"));

filter_input(input_type, variable, filter, options)
本函数用于对来自非安全来源的变量进行验证,比如用户的输入。
本函数可从各种来源获取输入:

参数描述
input_type必需。规定输入类型。参见上面的列表中可能的类型。
variable规定要过滤的变量。
filter可选。规定要使用的过滤器的 ID。默认是 FILTER_SANITIZE_STRING。过滤器 ID 可以是 ID 名称 (比如 FILTER_VALIDATE_EMAIL),或 ID 号(比如 274)。
options规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。

filter_list()
该函数的结果不是过滤器的 ID,而是过滤器名称

filter_var_array(array, args)

参数描述
array必需。规定带有字符串键的数组,包含要过滤的数据。
args可选。规定过滤器参数数组。

filter_var(variable, filter, options)

参数描述
variable必需。规定要过滤的变量。
filter可选。规定要使用的过滤器的 ID。
options规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。

常用方法:

是否是Bool类型

function checkBool($var)
{
    return filter_var($var, FILTER_VALIDATE_BOOLEAN);
}

检查Float类型

function checkFloat($var, $decimal = '.')
{
    return filter_var($var, FILTER_VALIDATE_FLOAT, array('options' => array('decimal' => $decimal)));
}

检查电话号码

function checkTel($var)
{
    return preg_match("/^([0-9]{3,4}-?)?[0-9]{7,8}$/", $var);
}

检查手机号码

function checkMobile($var)
{
    return preg_match("/^1[3-5,7,8]{1}[0-9]{9}$/", $var);
}

检查IP地址

function checkIP($var, $range = 'all')
{
    if($range == 'all') return filter_var($var, FILTER_VALIDATE_IP);
    if($range == 'public static') return filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE);
    if($range == 'private')
    {
       if($var == '127.0.0.1' or filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE) === false) return true;
       return false;
    }
}

身份证号检查

function checkIdcard($idcard)
{
    if(strlen($idcard)!=18) return false;
    $idcard = strtoupper($idcard);
    $cityList = array(
        '11','12','13','14','15','21','22',
        '23','31','32','33','34','35','36',
        '37','41','42','43','44','45','46',
        '50','51','52','53','54','61','62',
        '63','64','65','71','81','82','91'
    );

    if (!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/', $idcard)) return false;

    if (!in_array(substr($idcard, 0, 2), $cityList)) return false;

    $baseCode     = substr($idcard, 0, 17);
    $verifyCode   = substr($idcard, 17, 1);
    $interference = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

    $verifyConfig = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

    $total = 0;
    for($i=0; $i<17; $i++) $total += substr($baseCode, $i, 1) * $interference[$i];

    $mod = $total % 11;

    return $verifyCode == $verifyConfig[$mod];
}

检查正则表达式

function checkREG($var, $reg)
{
    return filter_var($var, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => $reg)));
}

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1546篇
  • 用户评论:805条
  • 开博至今:4244天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • 小云: 不错啊,收藏起来先
  • 小云: 收藏,很不错
  • memory: 动态添加没有试过,可能需要绑定事件了
  • 111: 动态添加按钮怎么添加,pick:class名是那个能在具体一点吗...
  • 今日头条: 文章不错非常喜欢
  • memory: 你看一下 gmp-6.1.2 的版本咧,不行换低点的.
  • 大叔: 发现编译出来的包,在 centos6 下运行错误。提示这个:ve...
  • : 感谢,我现在才知道还有快捷键这个东东!!!
  • 1: 天书啊
  • memory: 可以去官方网站找找手册了,好久不玩它了.
  • xiaoyan: 怎么解决的啊
  • 银行建设: 生产环境应该怎么搭建redis集群呢?
  • memory: 好久没折腾WIN了?不确认哟。
  • 虫虫: tomcat apache nginx能装吗
  • 咚咚: 开源的放一个吧
  • memory: 好几年不更新了。。。
  • liqitian: 不能用呀