PHP 简明教程

PHP 高级过滤器

1. 验证指定范围内的整数

在基础过滤器章节中,我们学习了如何验证一个变量是否为整数。filter_var() 函数还允许通过 options 参数来进一步限定整数的取值范围。

下例使用 filter_var() 验证一个变量是否既是整数,又在 1 到 200 的范围内:

代码示例:

<?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("变量值在指定范围内");
}
?>

2. 验证 IPv6 地址

默认情况下,FILTER_VALIDATE_IP 过滤器会验证任何有效的 IP 地址。如果您需要专门验证 IPv6 地址,可以使用特定的标志位。

下例使用 filter_var() 验证变量是否为有效的 IPv6 地址:

代码示例:

<?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 地址");
}
?>

3. 验证包含查询字符串的 URL

在某些场景下,您可能要求用户提供的 URL 必须包含查询字符串(Query String,即问号后的参数部分,如 ?name=val)。

下例使用 FILTER_FLAG_QUERY_REQUIRED 标志位来确保 URL 符合这一要求:

代码示例:

<?php
$url = "https://www.begindev.com?test=1";

if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
  echo("$url 是包含查询字符串的有效 URL");
} else {
  echo("$url 不包含查询字符串或不是有效 URL");
}
?>

4. 清洗 ASCII 值大于 127 的字符

在处理包含特殊符号或非英语字符的文本时,您可能需要移除所有 ASCII 值大于 127 的字符(这些字符通常属于扩展 ASCII 或 UTF-8 编码)。

下例使用 FILTER_FLAG_STRIP_HIGH 标志位来清洗字符串:

代码示例:

<?php
$str = "<h1>Hello WorldÆØÅ!</h1>";

$newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
echo $newstr;
?>
这里的 FILTER_SANITIZE_STRING 在 PHP 8.1+ 中已被弃用,建议在现代开发中结合使用 htmlspecialchars() 或其他 HTML 实体处理函数。

总结参考表:常用高级标志位

过滤器名称常用标志位 (Flags)说明
FILTER_VALIDATE_INTmin_range, max_range定义整数的最小值和最大值边界。
FILTER_VALIDATE_IPFILTER_FLAG_IPV4, FILTER_FLAG_IPV6强制验证特定的 IP 协议版本。
FILTER_VALIDATE_URLFILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED要求 URL 必须包含路径或查询字符串。
FILTER_SANITIZE_STRINGFILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH去除 ASCII 值过低(如控制字符)或过高的字符。