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
相关推荐
BingoGo13 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack13 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5