高级过滤器

检测一个数字是否在一个范围内

使用filter_var()函数来检测一个int型的变量是否在1到200内:

1
2
3
4
5
6
7
8
9
10
<?php
$int = 122;
$min = 1;
$max = 200;

if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
echo("变量值不在合法范围内");
} else {
echo("变量值在合法范围内");
}

运行结果
1
变量值在合法范围内

这个地方使用了FILTER_VALIDATE_INT,这个过滤器把值作为整数来验证

还可以添加选项和标志

  • min_range 规定最小整数
  • max_range 规定最大整数
  • FILTER_FLAG_ALLOW_OCTAL 允许八进制
  • FILTER_FLAG_ALLOW_HEX 允许十六进制

当在数组中规定选项时,选项必须存入一个名为 “options” 的关联多维数组中

具体使用方法看实例

检测IPV6地址

依旧是使用filter_var()函数来检测$ip变量是否为IPV6地址

1
2
3
4
5
6
7
8
<?php
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";

if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
echo("$ip 是一个 IPv6 地址");
} else {
echo("$ip 不是一个 IPv6 地址");
}

运行结果
1
2001:0db8:85a3:08d3:1319:8a2e:0370:7334 是一个 IPv6 地址

FILTER_VALIDATE_IP 过滤器把值作为 IP 进行验证
选项有

  • FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP
  • FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP
  • FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP
  • FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内

检测URL

1
2
3
4
5
6
7
8
<?php
$url = "http://www.runoob.com";

if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
echo("$url 是一个合法的 URL");
} else {
echo("$url 不是一个合法的 URL");
}

运行结果

1
http://www.runoob.com 不是一个合法的 URL

FILTER_VALIDATE_URL 过滤器把值作为 URL 来验证

标志

  • FILTER_FLAG_SCHEME_REQUIRED - 要求 URL 是 RFC 兼容 URL(比如 http://example)
  • FILTER_FLAG_HOST_REQUIRED - 要求 URL 包含主机名(比如 http://www.example.com)
  • FILTER_FLAG_PATH_REQUIRED - 要求 URL 在域名后存在路径(比如 www.example.com/example1/test2/)
  • FILTER_FLAG_QUERY_REQUIRED - 要求 URL 存在查询字符串(比如 “example.php?name=Peter&age=37”)

移除ASCII大于127的字符

1
2
3
4
5
<?php
$str = "<h1>Hello WorldÆØÅ!</h1>";

$newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
echo $newstr;

运行结果

1
Hello World!

FILTER_SANITIZE_STRING 过滤器去除或编码不需要的字符。

该过滤器删除那些对应用程序有潜在危害的数据。它用于去除标签以及删除或编码不需要的字符

  • FILTER_FLAG_NO_ENCODE_QUOTES - 该标志不编码引号
  • FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
  • FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 127 以上的字符
  • FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
  • FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 127 以上的字符
  • FILTER_FLAG_ENCODE_AMP - 把 & 字符编码为 &amp

更多过滤器请参考
https://www.runoob.com/php/php-ref-filter.html

总结

1.涉及到过滤都使用filter_var()函数

2.结合简单过滤器和选项可以做到很多操作

3.在使用FILTER_VALIDATE_INT时,想要使用数组来作为选项,数组名必须为options