PHP 简明教程

PHP 过滤器 (Filters)

1. 为什么要使用过滤器?

几乎所有的 Web 应用程序都依赖外部输入。这些数据通常来自用户、其他应用程序或服务(如 API)。通过过滤器,您可以确保应用程序接收到的是正确且安全的数据。

外部数据来源包括:

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

验证(Validating)数据: 确定数据是否以正确的格式存在(例如,检查是否为有效的邮件地址)。
清洗(Sanitizing)数据: 从数据中删除非法的字符(例如,从邮件地址中删除 HTML 标签)。

2. PHP 过滤器扩展

PHP 过滤器扩展拥有许多用于检查用户输入的函数。它可以让数据验证变得简单快捷。

filter_var() 函数是过滤器的核心,它既可以验证变量,也可以清洗变量。

3. PHP filter_list() 函数

filter_list() 函数可用于列出 PHP 过滤器扩展提供的所有支持的过滤器。

代码示例:

<table>
  <tr>
    <td>过滤器名称</td>
    <td>过滤器 ID</td>
  </tr>
  <?php
  foreach (filter_list() as $id =>$filter) {
    echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>';
  }
  ?>
</table>

4. PHP filter_var() 函数

filter_var() 函数通过指定的过滤器来过滤单个变量。

4.1 验证整数

下例使用 filter_var() 函数来验证一个变量是否为整数:

代码示例:

<?php
$int = 100;

if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("整数有效");
} else {
  echo("整数无效");
}
?>

4.2 提示:filter_var() 与 0 的问题

在上面的例子中,如果变量 $int 设置为 0,函数将返回 "整数无效"。为了解决这个问题,需要显式检查 0:

代码示例:

<?php
$int = 0;

if (filter_var($int, FILTER_VALIDATE_INT) === 0 || !filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("整数有效");
} else {
  echo("整数无效");
}
?>

4.3 验证 IP 地址

下例使用 filter_var() 函数来验证一个变量是否为有效的 IP 地址:

代码示例:

<?php
$ip = "127.0.0.1";

if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
  echo("$ip 是有效的 IP 地址");
} else {
  echo("$ip 不是有效的 IP 地址");
}
?>

4.4 清洗并验证邮件地址

下例先从变量中删除所有非法字符,然后检查它是否为有效的邮件地址:

代码示例:

<?php
$email = "john.doe@example.com";

// 删除邮件地址中所有非法字符
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// 验证邮件地址
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
  echo("$email 是有效的邮件地址");
} else {
  echo("$email 不是有效的邮件地址");
}
?>

4.5 清洗并验证 URL

下例先从变量中删除所有非法字符,然后检查它是否为有效的 URL:

代码示例:

<?php
$url = "https://www.begindev.com";

// 删除 URL 中所有非法字符
$url = filter_var($url, FILTER_SANITIZE_URL);

// 验证 URL
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
  echo("$url 是有效的 URL");
} else {
  echo("$url 不是有效的 URL");
}
?>