在开发中,处理外部输入与实现前后端数据交互是绕不开的核心环节。过滤器能帮我们有效验证和清理来自表单等外部的输入数据,确保数据安全可靠;而 JSON 作为前后端分离架构中数据交换的 “通用语言”,其在 PHP 中的处理方式更是开发者必须掌握的技能。本篇文章将记录过滤器与 JSON 的学习过程。
一、过滤器
许多 Web 应用程序接收外部输入,外部输入数据可以是:
- 表单中的用户输入
- Cookies
- Web 服务数据
- 服务器变量
- 数据库查询结果
提交的无效数据可能导致安全问题并破坏网页,通过使用 PHP 过滤器,可以确保应用程序获得正确的输入。
PHP 过滤器用于验证和清理外部输入。
- 验证数据 = 确定数据是否格式正确
- 清理数据 = 从数据中移除任何非法字符
PHP 过滤器扩展拥有许多用于检查用户输入的函数,使数据验证更加容易。
可以使用 filter_list() 函数列出 PHP 所支持的过滤器列表:
filter_list(): array
返回值
返回一个所支持的过滤器的名称的列表,如果没有这样子的过滤器的话则返回空数组。这个数组的索引不是过滤器id,需要通过 filter_id() 去根据名称获取它们。
示例
<table border="1">
<tr>
<td>过滤器ID</td>
<td>过滤器名称</td>
</tr>
<?php
foreach (filter_list() as $id =>$filter) {
echo '<tr><td>' . filter_id($filter) . '</td><td>' . $filter . '</td></tr>';
}
?>
</table>
上述示例的输出类似于:
1、filter_var() 函数
使用 filter_var() 对数据进行验证或清理。
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
参数
value |
必需。要过滤的内容。注意:标量值在过滤前,会被转换成字符串。 |
filter |
可选。要应用的过滤器 ID。过滤器类型 页面列出了可用的过滤器。如果省略,将使用 FILTER_DEFAULT,默认等同于 FILTER_UNSAFE_RAW。这将导致不进行任何默认过滤。 |
options |
可选。一个选项的关联数组,或者按位区分的标示。如果过滤器接受选项,可以通过数组的 "flags" 下标去提供这些标示。对于回调型的过滤器,应该传入 callable(回调,后续篇章中会进行说明)。这个回调函数必须接受一个参数(即待过滤的值),并且返回一个过滤/净化后的值。 |
返回值
返回过滤后的数据,如果过滤失败则返回 false 。
示例 删除字符串中所有 HTML 标签
$str = "<h1>Hello World!</h1>";
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
echo $newstr; // 输出 "Hello World!"
2、常用验证示例
2.1、验证整数
使用 FILTER_VALIDATE_INT 可对内容进行整数验证。
$int = "100";
if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
echo("是整数");
} else {
echo("不是整数");
}
2.2、验证IP地址
使用 FILTER_VALIDATE_IP 可对 IP 地址进行验证。
$ip = "127.0.0.1";
if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
echo("有效IP地址");
} else {
echo("无效IP地址");
}
2.3、清理并验证电子邮件地址
使用 FILTER_SANITIZE_EMAIL 可对电子邮件中的非法字符进行清理,FILTER_VALIDATE_EMAIL 验证值是否是有效的电子邮件地址。
$email = "test@example.com";
// 从电子邮件中删除非法字符
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// 验证电子邮件
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
echo("有效的电子邮件地址");
} else {
echo("无效的电子邮件地址");
}
更多的过滤器类型可查看 数据过滤器。
二、JSON
JSON 代表 JavaScript 对象表示法,它是一种存储和交换数据的语法。由于 JSON 格式是基于文本的格式,因此它可以轻松地发送到服务器和从服务器接收。
PHP 提供了一些内置函数来处理 JSON。这里主要说明 json_encode() 和 json_decode() 两个函数。
1、json_encode()
json_encode() 函数用于将值编码为 JSON 格式。
json_encode(mixed $value, int $flags = 0, int $depth = 512): string|false
返回字符串,包含了 value 值 JSON 形式的表示。如果参数是 array 或 object,则会递归序列化。
参数
value |
必需。待编码的 value ,除了 resource 类型之外,可以为任何数据类型。所有字符串数据的编码必须是 UTF-8。 |
flags |
可选。由以下常量组成的二进制掩码: JSON_FORCE_OBJECT、 JSON_HEX_QUOT、 JSON_HEX_TAG、 JSON_HEX_AMP、 JSON_HEX_APOS、 JSON_INVALID_UTF8_IGNORE、 JSON_INVALID_UTF8_SUBSTITUTE、 JSON_NUMERIC_CHECK、 JSON_PARTIAL_OUTPUT_ON_ERROR、 JSON_PRESERVE_ZERO_FRACTION、 JSON_PRETTY_PRINT、 JSON_UNESCAPED_LINE_TERMINATORS、 JSON_UNESCAPED_SLASHES、 JSON_UNESCAPED_UNICODE、 JSON_THROW_ON_ERROR。关于 JSON 常量可参考 JSON 常量。 |
depth |
可选。设置最大深度。 必须大于0。 |
返回值
成功则返回 JSON 编码的 string 或者在失败时返回 false 。
示例
$arr = array('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5);
echo json_encode($arr);
echo "<br>";
$arr = array('a', 'b', 'c');
echo json_encode($arr);
上述示例会输出:
{"a":1,"b":2,"c":3,"d":4,"e":5}
["a","b","c"]
2、json_decode()
json_decode() 函数用于将 JSON 对象解码为 PHP 对象或关联数组。
json_decode(
string $json,
?bool $associative = null,
int $depth = 512,
int $flags = 0
): mixed
接受一个 JSON 编码的字符串并且把它转换为 PHP 值。
参数
json |
必需。待解码的 json 格式的字符串。这个函数仅能处理 UTF-8 编码的数据。 |
associative |
可选。当为 true 时,JSON 对象将返回关联 array;当为 false 时,JSON 对象将返回 object。当为 null 时,JSON 对象将返回关联 array 或 object,这取决于是否在 flags 中设置 JSON_OBJECT_AS_ARRAY。 |
depth |
可选。需要解码的结构,其最大嵌套深度。该值必须大于 0 或者小于等于 2147483647。 |
flags |
可选。由 JSON_BIGINT_AS_STRING、JSON_INVALID_UTF8_IGNORE、JSON_INVALID_UTF8_SUBSTITUTE、JSON_OBJECT_AS_ARRAY、JSON_THROW_ON_ERROR 组成的掩码。关于 JSON 常量可参考 JSON 常量。 |
返回值
返回在 json 中编码的数据作为合适的 PHP 类型。没有引号的值 true、false 和 null 会相应地返回 true、false 和 null。如果 json 无法被解码,或者编码数据深度超过了嵌套限制的话,将会返回 null。
示例
$json = '{"a":1, "b":2, "c":3, "d":4, "e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
上述示例会输出:
object(stdClass)[1]
public 'a' => int 1
public 'b' => int 2
public 'c' => int 3
public 'd' => int 4
public 'e' => int 5
array (size=5)
'a' => int 1
'b' => int 2
'c' => int 3
'd' => int 4
'e' => int 5