PHP语法高级篇(三):过滤器与JSON

发布于:2025-07-19 ⋅ 阅读:(12) ⋅ 点赞:(0)

在开发中,处理外部输入与实现前后端数据交互是绕不开的核心环节。过滤器能帮我们有效验证和清理来自表单等外部的输入数据,确保数据安全可靠;而 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

网站公告

今日签到

点亮在社区的每一天
去签到