filter_var()

1. 定义

该函数使用特定的过滤器过滤一个变量。返回过滤后的值,如果过滤失败则返回FALSE。

2. 语法

filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] ) : mixed

3. 参数说明

参数 可选性 数据类型 描述
$variable 必需 mixed 要过滤的变量,如果是整型或浮点数,将被转为字符串
$filter 可选 整型 过滤器ID,默认为FILTER_DEFAULT,不进行过滤
$options 可选 mixed 如果指定的过滤器接受选项,则该参数可以通过flags键名来提供标识,options键名提供过滤器传入的参数

其中,flags有以下几种可选值:

ID Flags 描述
FILTER_FLAG_STRIP_LOW FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW 去除ASCII码小于 32 的字符
FILTER_FLAG_STRIP_HIGH FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW 去除ASCII码大于 127 的字符
FILTER_FLAG_STRIP_BACKTICK FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW 去除尖括号包裹的字符(即去除标签)
FILTER_FLAG_ALLOW_FRACTION FILTER_SANITIZE_NUMBER_FLOAT 允许点号(.)作为数字的小数分隔符
FILTER_FLAG_ALLOW_THOUSAND FILTER_SANITIZE_NUMBER_FLOAT, FILTER_VALIDATE_FLOAT 允许逗号(,)作为数字的千位分隔符
FILTER_FLAG_ALLOW_SCIENTIFIC FILTER_SANITIZE_NUMBER_FLOAT 允许字母eE作为科学计数法的单位
FILTER_FLAG_NO_ENCODE_QUOTES FILTER_SANITIZE_STRING 不对引号(包括单双引号)进行编码
FILTER_FLAG_ENCODE_LOW FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW 对ASICC码小于 32 的字符进行编码
FILTER_FLAG_ENCODE_HIGH FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW 对ASICC码小于 127 的字符进行编码
FILTER_FLAG_ENCODE_AMP FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW 对符号&进行编码
FILTER_NULL_ON_FAILURE FILTER_VALIDATE_BOOLEAN 将无法识别的布尔值返回为NULL
FILTER_FLAG_ALLOW_OCTAL FILTER_VALIDATE_INT 将以数字零开始的数值作为八进制数,但其后面的数字只能为0~7
FILTER_FLAG_ALLOW_HEX FILTER_VALIDATE_INT 将以0x0X开头的数值或字符串是为十六进数,但其后面的数字只能为a-fA-F0-9
FILTER_FLAG_EMAIL_UNICODE FILTER_VALIDATE_EMAIL 允许电子邮件地址的本地部分包含Unicode字符
FILTER_FLAG_IPV4 FILTER_VALIDATE_IP IP地址为iPv4的格式
FILTER_FLAG_IPV6 FILTER_VALIDATE_IP IP地址为iPv6的格式
FILTER_FLAG_NO_PRIV_RANGE FILTER_VALIDATE_IP 不验证以下iPv4私有地址范围:10.0.0.0/8172.16.0.0/12192.168.0.0/16;或者以FD/FC开头的iPv6私有地址
FILTER_FLAG_NO_RES_RANGE FILTER_VALIDATE_IP 不验证以下iPv4保留的地址范围:0.0.0.0/8169.254.0.0/16127.0.0.0/8240.0.0.0/4;或者以下保留的iPv6范围:::1/128::/128::ffff:0:0/96fe80::/10
FILTER_FLAG_SCHEME_REQUIRED FILTER_VALIDATE_URL 验证URL时,URL应包含 scheme 部分
FILTER_FLAG_HOST_REQUIRED FILTER_VALIDATE_URL 验证URL时,URL应包含 host 部分
FILTER_FLAG_PATH_REQUIRED FILTER_VALIDATE_URL 验证URL时,URL应包含 路径部分
FILTER_FLAG_QUERY_REQUIRED FILTER_VALIDATE_URL 验证URL时,URL应包含 查询字符串 部分
FILTER_REQUIRE_SCALAR 验证一个标量值
FILTER_REQUIRE_ARRAY 验证一个数组
FILTER_FORCE_ARRAY 如果该值是标量,则将其视为数组,并将标量值作为唯一元素

4. 示例

<?php

// filter_var()
// 使用特定的过滤器过滤一个变量。返回过滤后的值,如果过滤失败则返回FALSE
// 请仔细看各个示例,filter_var()函数的第二个参数为过滤器ID,第三个参数(如果有的话)为过滤器的选项及选项值

$val = 'true';// bool(true)
$val = '<p>hduahdka764734 is true</p>';// bool(false)
$val = 1;// bool(true)
$val = 0;// bool(false)
$val = 'djsda';// bool(false)
$val = false;// bool(false)
$res = filter_var($val, FILTER_VALIDATE_BOOLEAN);// 过滤 合法的布尔值
var_dump($res);

$val = 'dhjsksd.com';// string(11) "dhjsksd.com"
$val = '极速教程';// bool(false)
$val = 'https://www.jisuapi.com/';// bool(false)
$res = filter_var($val, FILTER_VALIDATE_DOMAIN, [
    'flags'=>FILTER_FLAG_HOSTNAME,
]);// 过滤 合法的域名:以字母字符开头,并只包含数字和连字符
var_dump($res);

$val = 'jisuapi@good.com';// string(16) "jisuapi@good.com"
$val = '乱七八糟@jisuapi.cc';// bool(false)
$val = 'luanqibazao@jisuapi';// bool(false)
$res = filter_var($val, FILTER_VALIDATE_EMAIL);// 根据RFC 822中的语法验证电子邮件地址,但不支持注释和空格折叠以及无点域名
var_dump($res);

$val = 3.1415926538;// float(3.1415926538)
$val = 3;// float(3)
$val = '3';// float(3)
$val = 'there are 3 trees.';// bool(false)
$res = filter_var($val, FILTER_VALIDATE_FLOAT);
var_dump($res);

$val = 1314520.123456;// float(1314520.123456)
$res = filter_var($val, FILTER_VALIDATE_FLOAT, [
    'flags'=>'FILTER_FLAG_ALLOW_THOUSAND',
    'options'=>'decimal'
]);
var_dump($res);

$val = '1234566';// int(1234566)
$val = '123.456';// bool(false)
$res = filter_var($val, FILTER_VALIDATE_INT);// 过滤整数
var_dump($res);

$val = '123';// int(123)
$val = 365;// bool(false)
$res = filter_var($val, FILTER_VALIDATE_INT, [
    'flags'=>FILTER_FLAG_ALLOW_OCTAL,
    'options'=>[
        'min_range'=>100,
        'max_range'=>150
    ]
]);// 过滤处于 100~150之间的十进制整数
var_dump($res);

$val = '122.224.186.156';// string(15) "122.224.186.156"
$res = filter_var($val, FILTER_VALIDATE_IP, [
    'flags'=>[FILTER_FLAG_IPV4, FILTER_FLAG_IPV6]
]);// 过滤 IP4 地址 和 IP6 地址
var_dump($res);

$val = '00:01:6C:06:A6:29';// string(17) "00:01:6C:06:A6:29"
$res = filter_var($val, FILTER_VALIDATE_MAC);// 过滤 MAC 地址:网卡卡号,一般为一组12位的16进制数。其中前6位代表网卡的生产厂商
var_dump($res);

$val = 'dhsuadsj,.lda0890';// string(17) "dhsuadsj,.lda0890"
$res = filter_var($val, FILTER_VALIDATE_REGEXP, [
    'options'=>[
        'regexp'=>'#[\d]+#'
    ]
]);// 过滤一个与Perl兼容的正则表达式
var_dump($res);

$val = 'dhjsksd.com';// bool(false)
$val = 'mailto://极速教程';// bool(false)
$val = 'https://www.jisuapi.com/';// string(24) "https://www.jisuapi.com/"
$res = filter_var($val, FILTER_VALIDATE_URL);// 过滤 合法的URL:有效的ASCII链接
var_dump($res);

$val = 'jisuapi@good.com';// string(16) "jisuapi@good.com"
// $val = '乱七八糟@jisuapi.cc';// string(11) "@jisuapi.cc"
// $val = 'luanqibazao@jisuapi';// string(19) "luanqibazao@jisuapi"
$res = filter_var($val, FILTER_SANITIZE_EMAIL);// 过滤所有除字母、数字、!#$%&'*+-=?^_`{|}~@.[] 以外的字符
var_dump($res);

$val = '<code>$val = 520;</code>';// string(44) "%3Ccode%3E%24val%20%3D%20520%3B%3C%2Fcode%3E"
$val = 'http://www.test.com/api/query?name=极速数据';// string(85) "http%3A%2F%2Fwww.test.com%2Fapi%2Fquery%3Fname%3D%E6%9E%81%E9%80%9F%E6%95%B0%E6%8D%AE"
$res = filter_var($val, FILTER_SANITIZE_ENCODED, [
    'flags'=>FILTER_FLAG_STRIP_BACKTICK
]);// URL编码字符串,编码字符可选
var_dump($res);

$val = "SELECT * FROM table WHERE name='jisuapi'";// string(42) "SELECT * FROM table WHERE name=\'jisuapi\'"
$res = filter_var($val, FILTER_SANITIZE_MAGIC_QUOTES);// 转义字符串
var_dump($res);

$val = '这里有一串数字560.777';// string(7) "560.777"
$res = filter_var($val, FILTER_SANITIZE_NUMBER_FLOAT,  [
    'flags'=>FILTER_FLAG_ALLOW_FRACTION
]);// 移除所有不能代表浮点数(数字、小数点、正负号和科学计数法字母 e 或 E)的字符
var_dump($res);

$val = '这里有一串数字560.777';// string(6) "560777"
$res = filter_var($val, FILTER_SANITIZE_NUMBER_INT);// 移除所有不能代表整数(数字和正负号)的字符
var_dump($res);

$val = '<code>$val = 520;</code>';// string(40) "&#60;code&#62;$val = 520;&#60;/code&#62;"
$res = filter_var($val, FILTER_SANITIZE_SPECIAL_CHARS);// 将HTML标签特殊符号(<>、& 以及ASCII码小于32的符号)进行编码
var_dump($res);

$val = '<code>$val = "520";</code>';// string(48) "&lt;code&gt;$val = &quot;520&quot;;&lt;/code&gt;"
$res = filter_var($val, FILTER_SANITIZE_FULL_SPECIAL_CHARS);// 将HTML标签特殊符号(<>、& 以及ASCII码小于32的符号)转为HTML实体
var_dump($res);

$val = '<code>$val = "520";</code>';// string(13) "$val = "520";"
$res = filter_var($val, FILTER_SANITIZE_STRING, [
    'flags'=>FILTER_FLAG_NO_ENCODE_QUOTES
]);// 过滤HTML标签并对特殊字符进行编码(可选)
var_dump($res);

$val = '<code>$val = "520";</code>';// string(21) "$val = &#34;520&#34;;"
$res = filter_var($val, FILTER_SANITIZE_STRIPPED);// 过滤HTML标签并对特殊字符进行编码(可选),上一案例 FILTER_SANITIZE_STRING 的别名
var_dump($res);

$val = 'http://www.jisuapi.com/';// string(23) "http://www.jisuapi.com/"
$val = 'http://www.jisuapi.com/?query=教程';// string(30) "http://www.jisuapi.com/?query="
$res = filter_var($val, FILTER_SANITIZE_URL);// 移除所有非数字、字母、$-_.+!*'(),{}|\\^~[]`<>#%";/?:@&= 的字符
var_dump($res);

$val = '<code>$val = "520";</code>';// string(26) "<code>$val = "520";</code>"
$val = 'http://www.jisuapi.com/?query=教程';// string(36) "http://www.jisuapi.com/?query=教程"
$res = filter_var($val, FILTER_UNSAFE_RAW);// 不过滤,但可以选择去除或编码特殊字符,默认行为
var_dump($res);

5. 延展阅读

  • filter_var_array():以数组形式过滤多个变量,成功时返回包含所请求变量的数组,过滤失败则返回FALSE,变量不存在则返回NULL
  • filter_input():通过检查指定类型中是否存在指定变量,并使用特定过滤器处理该变量
  • filter_input_array():通过检查指定类型中存在的一系列变量,并使用特定过滤器处理该系列变量