PHP Filter

Filter constants and functions reference.

Intermediate
Key PointsValidate filters return `false`; sanitise filters return a string. Do not mix them.

Functions

FunctionPurpose
filter_var过滤单个值
filter_var_array按规则表批量过滤
filter_input从 $_GET / $_POST 等直接取并过滤
filter_input_array批量版 filter_input
filter_has_var判断输入变量是否存在
filter_list列出所有可用过滤器
filter_id按名字取过滤器 ID

Validate filters

PHP
<?php
$cases = [
    ["email", "tom@example.com", FILTER_VALIDATE_EMAIL],
    ["email", "tom@", FILTER_VALIDATE_EMAIL],
    ["url", "https://example.com", FILTER_VALIDATE_URL],
    ["ip", "192.168.1.1", FILTER_VALIDATE_IP],
    ["bool", "yes", FILTER_VALIDATE_BOOLEAN],
    ["bool", "maybe", FILTER_VALIDATE_BOOLEAN],
    ["int", "42", FILTER_VALIDATE_INT],
    ["int", "4.2", FILTER_VALIDATE_INT],
    ["mac", "00:1A:2B:3C:4D:5E", FILTER_VALIDATE_MAC],
];

foreach ($cases as [$type, $val, $f]) {
    $r = filter_var($val, $f);
    echo $type . " " . $val . " => " . ($r === false ? "失败" : var_export($r, true)) . "\n";
}
Output
email tom@example.com => 'tom@example.com'
email tom@ => 失败
url https://example.com => 'https://example.com'
ip 192.168.1.1 => '192.168.1.1'
bool yes => true
bool maybe => 失败
int 42 => 42
int 4.2 => 失败
mac 00:1A:2B:3C:4D:5E => '00:1A:2B:3C:4D:5E'

Sanitise filters

PHP
<?php
echo filter_var("  a b  ", FILTER_SANITIZE_SPECIAL_CHARS), "|\n";
echo filter_var("a1b2c3", FILTER_SANITIZE_NUMBER_INT), "\n";
echo filter_var("1.5abc", FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), "\n";
echo filter_var("a b@c d.com", FILTER_SANITIZE_EMAIL), "\n";
echo filter_var("<p>x</p>", FILTER_SANITIZE_FULL_SPECIAL_CHARS), "\n";
Output
  a b  |
123
1.5
ab@cd.com
&lt;p&gt;x&lt;/p&gt;
FILTER_SANITIZE_SPECIAL_CHARS does not escape single quotes; htmlspecialchars($v, ENT_QUOTES) does. Inside value='...' the former fails. **Prefer htmlspecialchars with ENT_QUOTES.**

filter_input

PHP
<?php
// 等价于 filter_var($_GET["id"] ?? null, FILTER_VALIDATE_INT)
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);

// 带默认值
$page = filter_input(INPUT_GET, "page", FILTER_VALIDATE_INT, [
    "options" => ["default" => 1, "min_range" => 1],
]);

echo $id === null ? "参数缺失" : ($id === false ? "格式错误" : "id=$id"), "\n";
echo "page=$page\n";

var_dump(filter_has_var(INPUT_GET, "id"));
Output
参数缺失
page=1
bool(false)

filter_input is tri-state: null means missing, false means invalid, anything else is the value. Stronger than filter_var, which conflates the two.

Custom callback

PHP
<?php
$slug = filter_var("Hello World 2023", FILTER_CALLBACK, [
    "options" => fn($v) => strtolower(str_replace(" ", "-", trim($v))),
]);
echo $slug, "\n";

$r = filter_var_array(
    ["a" => " 1 ", "b" => "2"],
    ["a" => ["filter" => FILTER_CALLBACK, "options" => "intval"],
     "b" => FILTER_VALIDATE_INT]
);
print_r($r);
Output
hello-world-2023
Array
(
    [a] => 1
    [b] => 2
)

Friends & Partners