PHP 过滤器(Filters)完整指南
1. 什么是 PHP 过滤器?
PHP 过滤器(Filters)用于 验证 和 清理 数据,主要用于:
- 过滤 用户输入数据(如
$_GET、$_POST) - 过滤 表单数据
- 处理 API 请求参数
- 过滤 数据库输入
- 过滤 文件上传
2. filter_var() – 过滤单个变量
语法
filter_var(变量, 过滤器, 选项);
示例
$email = "test@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "有效的 Email 地址";
} else {
echo "无效的 Email 地址";
}
📌 FILTER_VALIDATE_EMAIL 用于 验证 Email 格式。
3. filter_input() – 过滤全局变量
语法
filter_input(类型, 变量名, 过滤器, 选项);
类型:INPUT_GETINPUT_POSTINPUT_COOKIEINPUT_SERVERINPUT_ENV变量名:要检查的变量(如"email")过滤器:验证或清理数据选项(可选):额外的验证规则
示例
$email = filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL);
if ($email) {
echo "有效 Email";
} else {
echo "无效 Email";
}
📌 从 $_GET['email'] 读取数据,并进行 Email 验证。
4. 过滤器类型
PHP 提供了 两大类 过滤器:
- 验证过滤器(Validation)✅:用于 检查 数据是否符合格式
- 清理过滤器(Sanitization)🧼:用于 删除 不需要的字符
5. 验证过滤器
常见 FILTER_VALIDATE_* 过滤器
| 过滤器 | 作用 | 示例 |
|---|---|---|
FILTER_VALIDATE_INT | 验证整数 | 123 ✅, "abc" ❌ |
FILTER_VALIDATE_FLOAT | 验证浮点数 | 3.14 ✅, "test" ❌ |
FILTER_VALIDATE_BOOLEAN | 验证布尔值 | true, false, 1, 0, "yes" ✅ |
FILTER_VALIDATE_EMAIL | 验证 Email | "test@example.com" ✅ |
FILTER_VALIDATE_URL | 验证 URL | "https://www.example.com" ✅ |
FILTER_VALIDATE_IP | 验证 IP 地址 | "192.168.1.1" ✅ |
FILTER_VALIDATE_MAC | 验证 MAC 地址 | "00:1A:2B:3C:4D:5E" ✅ |
示例
$int = "100";
if (filter_var($int, FILTER_VALIDATE_INT)) {
echo "有效整数";
} else {
echo "无效整数";
}
6. 清理过滤器
常见 FILTER_SANITIZE_* 过滤器
| 过滤器 | 作用 | 示例 |
|---|---|---|
FILTER_SANITIZE_STRING | 移除 HTML 标签 | "Hello <b>World</b>" → "Hello World" |
FILTER_SANITIZE_EMAIL | 移除非法 Email 字符 | "test @ example.com" → "test@example.com" |
FILTER_SANITIZE_URL | 移除非法 URL 字符 | "http:// example.com" |
FILTER_SANITIZE_NUMBER_INT | 过滤整数(保留数字+-) | "123abc" → "123" |
FILTER_SANITIZE_NUMBER_FLOAT | 过滤浮点数(支持小数点) | "3.14abc" → "3.14" |
FILTER_SANITIZE_SPECIAL_CHARS | HTML 实体编码 | "<script>" → "<script>" |
示例
$dirty_string = "<h1>Hello</h1>";
$clean_string = filter_var($dirty_string, FILTER_SANITIZE_STRING);
echo $clean_string; // 输出 "Hello"
📌 FILTER_SANITIZE_STRING 移除了 HTML 标签,防止 XSS 攻击。
7. 选项和标志
PHP 过滤器 支持自定义选项 以更精确地控制数据格式。
示例:设置最小/最大整数范围
$options = array(
"options" => array(
"min_range" => 1,
"max_range" => 100
)
);
$number = 50;
if (filter_var($number, FILTER_VALIDATE_INT, $options)) {
echo "有效数字";
} else {
echo "超出范围";
}
8. 过滤多个输入数据
使用 filter_input_array() 可以一次性过滤多个数据。
示例
$filters = array(
"name" => FILTER_SANITIZE_STRING,
"email" => FILTER_VALIDATE_EMAIL,
"age" => array(
"filter" => FILTER_VALIDATE_INT,
"options" => array("min_range" => 18, "max_range" => 100)
)
);
$input = filter_input_array(INPUT_POST, $filters);
if ($input["email"] && $input["age"]) {
echo "数据有效";
} else {
echo "数据无效";
}
9. 结合 htmlspecialchars() 防止 XSS
$name = filter_input(INPUT_GET, "name", FILTER_SANITIZE_STRING);
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
📌 防止 XSS 攻击,确保特殊字符(< > & " ')不会执行脚本。
10. 综合案例
过滤和验证用户注册信息
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = filter_var($_POST["username"], FILTER_SANITIZE_STRING);
$email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
$age = filter_var($_POST["age"], FILTER_VALIDATE_INT, [
"options" => ["min_range" => 18, "max_range" => 100]
]);
if ($username && $email && $age) {
echo "注册成功!";
} else {
echo "输入无效,请检查数据格式!";
}
}
11. 过滤器最佳实践
✅ 表单数据一定要过滤:防止 SQL 注入 & XSS 攻击
✅ 使用 filter_var() 进行数据清理,避免手写正则
✅ 对于 URL、Email、IP 地址等数据使用 FILTER_VALIDATE_*
✅ 对用户输入的字符串使用 FILTER_SANITIZE_STRING 过滤特殊字符
✅ 结合 htmlspecialchars() 确保前端安全
总结
| 方法 | 作用 |
|---|---|
filter_var() | 过滤单个变量 |
filter_input() | 过滤 $_GET / $_POST / $_COOKIE / $_SERVER |
filter_input_array() | 批量过滤 |
FILTER_VALIDATE_* | 用于 验证 数据 |
FILTER_SANITIZE_* | 用于 清理 数据 |
htmlspecialchars() | 防止 XSS 攻击 |
更多详细内容请关注其他相关文章!