filter_var()
函数是一个强大的工具,用于 验证 和 过滤 数据,确保输入符合预期格式或安全标准。它支持多种过滤器类型,涵盖常见的数据验证场景。以下是具体用法和示例代码:
1. 函数语法
mixed filter_var( mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0 )
$value
:要过滤的值。$filter
:预定义的过滤器类型(如FILTER_VALIDATE_EMAIL
)。$options
:可选参数,用于配置过滤器(如范围限制、正则表达式等)。
2. 验证过滤器(Validation Filters)
验证数据是否符合特定格式,返回 验证后的值 或 false
(验证失败)。
(1) 验证邮箱
$email = "user@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "邮箱有效!";
} else {
echo "邮箱无效!";
}
(2) 验证 URL
$url = "https://www.example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL 有效!";
} else {
echo "URL 无效!";
}
(3) 验证整数范围
$age = "25";
$options = [
"options" => [
"min_range" => 1,
"max_range" => 120
]
];
if (filter_var($age, FILTER_VALIDATE_INT, $options)) {
echo "年龄有效!";
} else {
echo "年龄无效!";
}
(4) 验证 IP 地址
$ip = "192.168.1.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
echo "IP 地址有效!";
} else {
echo "IP 地址无效!";
}
3. 清理过滤器(Sanitization Filters)
对数据进行清理(如移除非法字符),返回 处理后的字符串。
(1) 清理字符串中的 HTML 标签
$input = "<script>alert('XSS');</script>";
$clean = filter_var($input, FILTER_SANITIZE_STRING);
echo $clean; // 输出:alert('XSS');
(2) 清理 URL 非法字符
$url = "https://www.example.com/<script>";
$clean_url = filter_var($url, FILTER_SANITIZE_URL);
echo $clean_url; // 输出:https://www.example.com/script
(3) 清理邮箱非法字符
$email = "user(@example.com";
$clean_email = filter_var($email, FILTER_SANITIZE_EMAIL);
echo $clean_email; // 输出:user@example.com
4. 自定义过滤规则
(1) 使用正则表达式验证
$phone = "138-1234-5678"; $options = [ "options" => [ "regexp" => "/^\d{3}-\d{4}-\d{4}$/" ] ]; if (filter_var($phone, FILTER_VALIDATE_REGEXP, $options)) { echo "手机号有效!"; } else { echo "手机号无效!"; }
(2) 自定义清理回调函数
$input = "Hello! 123"; $clean = filter_var($input, FILTER_CALLBACK, [ "options" => function($value) { return preg_replace("/[^A-Za-z]/", "", $value); } ]); echo $clean; // 输出:Hello
5. 错误处理
通过返回值判断是否验证失败:
$email = "invalid-email"; $result = filter_var($email, FILTER_VALIDATE_EMAIL); if ($result === false) { echo "邮箱无效!"; } else { echo "邮箱有效:" . $result; }
6. 完整表单验证示例
<?php $errors = []; $email = $_POST['email'] ?? ''; $age = $_POST['age'] ?? ''; // 验证邮箱 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = "邮箱格式无效!"; } // 验证年龄(1-120岁) $ageOptions = [ "options" => ["min_range" => 1, "max_range" => 120] ]; if (!filter_var($age, FILTER_VALIDATE_INT, $ageOptions)) { $errors[] = "年龄需在1-120岁之间!"; } // 输出结果 if (empty($errors)) { echo "数据验证通过!"; } else { foreach ($errors as $error) { echo "<p>错误:$error</p>"; } } ?>
7. 常用过滤器列表
过滤器类型 用途 FILTER_VALIDATE_EMAIL
验证邮箱格式 FILTER_VALIDATE_URL
验证 URL 格式 FILTER_VALIDATE_IP
验证 IP 地址 FILTER_VALIDATE_INT
验证整数 FILTER_VALIDATE_FLOAT
验证浮点数 FILTER_VALIDATE_REGEXP
正则表达式验证 FILTER_SANITIZE_EMAIL
清理邮箱非法字符 FILTER_SANITIZE_STRING
移除 HTML 标签(PHP 8.1+ 已弃用) FILTER_SANITIZE_URL
清理 URL 非法字符 FILTER_SANITIZE_NUMBER_INT
移除非数字字符
注意事项
输入来源:始终从
$_POST
或$_GET
获取原始数据后再过滤。多层防护:
filter_var()
不能替代其他安全措施(如 SQL 预处理、XSS 转义)。PHP 版本:某些过滤器(如
FILTER_SANITIZE_STRING
)在 PHP 8.1+ 中已弃用,建议使用htmlspecialchars()
替代。
通过合理使用 filter_var()