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_INT | min_range, max_range | 定义整数的最小值和最大值边界。 |
| FILTER_VALIDATE_IP | FILTER_FLAG_IPV4, FILTER_FLAG_IPV6 | 强制验证特定的 IP 协议版本。 |
| FILTER_VALIDATE_URL | FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED | 要求 URL 必须包含路径或查询字符串。 |
| FILTER_SANITIZE_STRING | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH | 去除 ASCII 值过低(如控制字符)或过高的字符。 |