PHP filter_id() 函数

定义和用法

filter_id() 函数返回指定过滤器名称对应的过滤器ID。

过滤器ID是一个整数值,可以在其他过滤函数中代替过滤器名称使用。

这个函数是PHP过滤器扩展的一部分,用于验证和过滤数据。

语法

filter_id(string $filtername): int|false

参数值

参数 描述
$filtername 过滤器名称的字符串(不包含"FILTER_"前缀)
例如:对于 FILTER_VALIDATE_EMAIL,只需传递 "validate_email""VALIDATE_EMAIL"

返回值

  • 返回过滤器ID(整数)
  • 如果指定的过滤器名称不存在,返回 false

常用过滤器名称和ID对应表

过滤器名称 过滤器常量 filter_id() 参数示例 返回的ID
验证布尔值 FILTER_VALIDATE_BOOLEAN "validate_boolean" 258
验证邮件地址 FILTER_VALIDATE_EMAIL "validate_email" 274
验证浮点数 FILTER_VALIDATE_FLOAT "validate_float" 259
验证整数 FILTER_VALIDATE_INT "validate_int" 257
验证IP地址 FILTER_VALIDATE_IP "validate_ip" 275
验证URL FILTER_VALIDATE_URL "validate_url" 273
去除标签 FILTER_SANITIZE_STRING "sanitize_string" 513
去除特殊字符 FILTER_SANITIZE_SPECIAL_CHARS "sanitize_special_chars" 515
去除邮件非法字符 FILTER_SANITIZE_EMAIL "sanitize_email" 517
去除URL非法字符 FILTER_SANITIZE_URL "sanitize_url" 518

示例

示例 1:获取常用过滤器的ID

<?php
// 获取各种过滤器的ID
echo "FILTER_VALIDATE_EMAIL ID: " . filter_id("validate_email") . "<br>";
echo "FILTER_VALIDATE_INT ID: " . filter_id("validate_int") . "<br>";
echo "FILTER_VALIDATE_URL ID: " . filter_id("validate_url") . "<br>";
echo "FILTER_SANITIZE_STRING ID: " . filter_id("sanitize_string") . "<br>";
echo "FILTER_SANITIZE_EMAIL ID: " . filter_id("sanitize_email") . "<br>";
?>
输出:
FILTER_VALIDATE_EMAIL ID: 274
FILTER_VALIDATE_INT ID: 257
FILTER_VALIDATE_URL ID: 273
FILTER_SANITIZE_STRING ID: 513
FILTER_SANITIZE_EMAIL ID: 517

示例 2:动态选择过滤器

<?php
// 根据用户输入动态选择过滤器
$filterType = "email"; // 可以从表单获取
$userInput = "test@example.com";

// 动态构建过滤器名称
$filterName = "validate_" . $filterType;
$filterId = filter_id($filterName);

if ($filterId !== false) {
    $result = filter_var($userInput, $filterId);
    if ($result !== false) {
        echo "验证成功: " . htmlspecialchars($result);
    } else {
        echo "验证失败";
    }
} else {
    echo "无效的过滤器类型";
}
?>

示例 3:检查过滤器是否存在

<?php
// 检查过滤器是否存在
$filtersToCheck = ["validate_email", "validate_ip", "validate_float", "invalid_filter"];

foreach ($filtersToCheck as $filter) {
    $filterId = filter_id($filter);
    if ($filterId !== false) {
        echo "过滤器 '$filter' 存在,ID: $filterId<br>";
    } else {
        echo "过滤器 '$filter' 不存在<br>";
    }
}
?>
输出:
过滤器 'validate_email' 存在,ID: 274
过滤器 'validate_ip' 存在,ID: 275
过滤器 'validate_float' 存在,ID: 259
过滤器 'invalid_filter' 不存在

示例 4:使用过滤器ID和名称的对比

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

// 方法1:使用过滤器常量名称
$result1 = filter_var($email, FILTER_VALIDATE_EMAIL);

// 方法2:使用过滤器ID
$filterId = filter_id("validate_email");
$result2 = filter_var($email, $filterId);

echo "使用常量名称验证结果: " . ($result1 !== false ? "有效" : "无效") . "<br>";
echo "使用filter_id()获取ID验证结果: " . ($result2 !== false ? "有效" : "无效") . "<br>";
echo "两种方法结果是否相同: " . ($result1 == $result2 ? "是" : "否") . "<br>";
?>

示例 5:创建过滤器配置数组

<?php
// 创建动态过滤器配置
$filters = [
    'email' => filter_id('validate_email'),
    'age' => filter_id('validate_int'),
    'url' => filter_id('validate_url'),
    'name' => filter_id('sanitize_string')
];

$data = [
    'email' => 'test@example.com',
    'age' => '25',
    'url' => 'https://www.example.com',
    'name' => '<script>alert("xss")</script>John'
];

foreach ($data as $key => $value) {
    if (isset($filters[$key])) {
        $filtered = filter_var($value, $filters[$key]);
        echo "$key: " . htmlspecialchars($filtered) . "<br>";
    }
}
?>

注意事项

  • filter_id() 函数参数不区分大小写:filter_id("validate_email")filter_id("VALIDATE_EMAIL") 返回相同结果
  • 参数中不需要包含"FILTER_"前缀
  • 返回的过滤器ID在不同版本的PHP中可能不同
  • PHP 5.2.0 及以上版本支持此函数
  • 建议优先使用过滤器常量名称,代码更易读
  • 使用前最好检查返回值是否为 false,确保过滤器存在

与常量直接使用的对比

场景 使用常量 使用filter_id()
代码可读性 (常量名称直观) (需要知道字符串参数)
性能 (直接使用常量) (需要函数调用)
动态性 (静态) (可动态生成)
错误检查 直接 需要检查返回值

浏览器支持

该函数是 PHP 后端函数,与浏览器无关。