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

在开发中,处理外部输入与实现前后端数据交互是绕不开的核心环节。过滤器能帮我们有效验证和清理来自表单等外部的输入数据,确保数据安全可靠;而 JSON 作为前后端分离架构中数据交换的 "通用语言",其在 PHP 中的处理方式更是开发者必须掌握的技能。本篇文章将记录过滤器与 JSON 的学习过程。


一、过滤器

许多 Web 应用程序接收外部输入,外部输入数据可以是:

  • 表单中的用户输入
  • Cookies
  • Web 服务数据
  • 服务器变量
  • 数据库查询结果

提交的无效数据可能导致安全问题并破坏网页,通过使用 PHP 过滤器,可以确保应用程序获得正确的输入。

PHP 过滤器用于验证和清理外部输入。

  • 验证数据 = 确定数据是否格式正确
  • 清理数据 = 从数据中移除任何非法字符

PHP 过滤器扩展拥有许多用于检查用户输入的函数,使数据验证更加容易。

可以使用 filter_list() 函数列出 PHP 所支持的过滤器列表:

php 复制代码
filter_list(): array

返回值

返回一个所支持的过滤器的名称的列表,如果没有这样子的过滤器的话则返回空数组。这个数组的索引不是过滤器id,需要通过 filter_id() 去根据名称获取它们。

示例

php 复制代码
<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() 对数据进行验证或清理。

php 复制代码
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 标签

php 复制代码
$str = "<h1>Hello World!</h1>";
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
echo $newstr; // 输出 "Hello World!"

2、常用验证示例

2.1、验证整数

使用 FILTER_VALIDATE_INT可对内容进行整数验证。

php 复制代码
$int = "100";
if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("是整数");
} else {
  echo("不是整数");
}

2.2、验证IP地址

使用 FILTER_VALIDATE_IP可对 IP 地址进行验证。

php 复制代码
$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验证值是否是有效的电子邮件地址。

php 复制代码
$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 格式。

php 复制代码
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 。

示例

php 复制代码
$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);

上述示例会输出:

php 复制代码
{"a":1,"b":2,"c":3,"d":4,"e":5}
["a","b","c"]

2、json_decode()

json_decode() 函数用于将 JSON 对象解码为 PHP 对象或关联数组。

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。

示例

php 复制代码
$json = '{"a":1, "b":2, "c":3, "d":4, "e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));

上述示例会输出:

php 复制代码
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
相关推荐
用户3074596982071 天前
🐶🐱 协变与逆变:用“动物收容所”讲清楚 PHP 类型的“灵活继承”
php
用户3074596982071 天前
🚀 PHP 面向对象四大核心知识点全面详解
php
herderl1 天前
【无标题】命名管道(Named Pipe)是一种在操作系统中用于**进程间通信(IPC)** 的机制
java·linux·服务器·嵌入式硬件·php
云博客-资源宝2 天前
php防注入和XSS过滤参考代码
开发语言·php·xss
huluang2 天前
PHP版本控制系统:高效文档管理
开发语言·php
Bruce_Liuxiaowei2 天前
绕过文件上传漏洞并利用文件包含漏洞获取系统信息的技术分析
运维·网络安全·php·apache
用户3074596982072 天前
🌟 PHP 重载(Overloading)——不是你想的那样!
php
用户3074596982072 天前
🌟 匿名类(Anonymous Class)——“一次性用完就扔的小纸条”
php
钢铁男儿3 天前
C# 异步编程:提升程序性能与用户体验的利器
c#·php·ux
暗流者3 天前
信息安全简要
开发语言·网络·php