Filter var: примеры (PHP)

Функция filter_var в PHP: валидация и очистка данных
Раздел: Фильтрация данных
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

Функция filter_var выполняет фильтрацию данных с использованием указанного фильтра. Она применяется для валидации и санации переменных, чаще всего пользовательского ввода. Функция доступна в PHP с версии 5.2.0.

Синтаксис и аргументы

Синтаксис функции: filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = null): mixed

Аргументы:

  • $value - значение для фильтрации. Может быть строкой, массивом или другим типом.
  • $filter - идентификатор применяемого фильтра. По умолчанию FILTER_DEFAULT (эквивалентно FILTER_UNSAFE_RAW).
  • $options - ассоциативный массив опций или побитовая маска флагов. Для некоторых фильтров требуется указать флаги.
Основные категории фильтров

Фильтры разделены на несколько групп: валидация, санация и другие. Фильтры валидации проверяют соответствие формату и возвращают значение или false. Фильтры санации очищают данные и возвращают измененное значение.

Базовые примеры
Валидация email
$email = 'user@example.com';
$result = filter_var($email, FILTER_VALIDATE_EMAIL);
echo $result !== false ? 'Valid' : 'Invalid';
Valid
Санация email
$email = 'user@example.com
Похожие функции PHP

В PHP существуют другие функции для работы с данными:

  • filter_input - получает и фильтрует внешнюю переменную. Удобна для обработки GET, POST, COOKIE данных без прямого доступа к суперглобальным массивам.
  • preg_match - выполняет проверку по регулярному выражению. Требует написания шаблона, но дает гибкость.
  • ctype_* - семейство функций проверки символов (ctype_digit, ctype_alpha). Быстрее для простых проверок.
  • htmlspecialchars - преобразует специальные символы в HTML-сущности. Используется для вывода в HTML.
  • intval, floatval - преобразуют переменную к числу. Не проверяют формат, только извлекают число.

Выбор функции зависит от задачи. filter_var предлагает стандартизированный подход для частых сценариев валидации и санации.

Типичные ошибки
Неправильная интерпретация возвращаемого значения
$value = '0';
$result = filter_var($value, FILTER_VALIDATE_BOOLEAN);
if ($result) {
    echo 'True';
} else {
    echo 'False';
}
False

Значения '0', 'false', 'off' возвращают false при валидации булевого типа, что может быть неочевидным.

Использование FILTER_VALIDATE_INT для нецелых чисел
$value = '123.45';
$result = filter_var($value, FILTER_VALIDATE_INT);
var_dump($result);
bool(false)

Функция возвращает false для дробных чисел, так как ожидает целое значение.

Отсутствие проверки на false
$url = 'invalid-url';
$result = filter_var($url, FILTER_VALIDATE_URL);
$host = parse_url($result, PHP_URL_HOST);
echo $host;
Warning: parse_url() expects parameter 1 to be string, bool given

Необходимо проверять, что функция не вернула false перед дальнейшей обработкой.

Изменения в новых версиях PHP

В PHP 8.0 появилась поддержка FILTER_VALIDATE_BOOL как альтернативы FILTER_VALIDATE_BOOLEAN. Оба идентификатора работают одинаково.

В PHP 8.1 добавлен флаг FILTER_FLAG_EMAIL_UNICODE для валидации email с Unicode символами.

$email = 'test@пример.рф';
$result = filter_var($email, FILTER_VALIDATE_EMAIL, FILTER_FLAG_EMAIL_UNICODE);
var_dump($result);
string(31) "test@пример.рф"

С версии PHP 8.0 строгая типизация влияет на поведение функции при неверных типах аргументов.

Расширенные примеры
Кастомный фильтр с callback
Пример php
function custom_filter($value) {
    return strtoupper($value);
}
$options = ['options' => ['callback' => 'custom_filter']];
$result = filter_var('test', FILTER_CALLBACK, $options);
echo $result;
TEST
Валидация IP-адреса с флагами
Пример php
$ipv6 = '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
$result = filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
var_dump($result);
string(39) "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
Санация числа с плавающей точкой
Пример php
$number = '123.45abc';
$result = filter_var($number, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
echo $result;
123.45
Валидация мак-адреса
Пример php
$mac = '00:1A:2B:3C:4D:5E';
$result = filter_var($mac, FILTER_VALIDATE_MAC);
var_dump($result);
string(17) "00:1A:2B:3C:4D:5E"
Фильтрация массива
Пример php
$data = ['email' => 'test@example.com', 'age' => '25'];
$filters = [
    'email' => FILTER_VALIDATE_EMAIL,
    'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1]]
];
$result = filter_var_array($data, $filters);
print_r($result);
Array
(
    [email] => test@example.com
    [age] => 25
)
Аналоги в других языках

Filter var в Python

В Python нет прямой аналогии, но есть библиотеки и методы для валидации.

import re
email = 'user@example.com'
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
is_valid = bool(re.match(pattern, email))
print(is_valid)
True

Filter var в Javascript

JavaScript предоставляет регулярные выражения и API для валидации.

const email = 'user@example.com';
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const isValid = regex.test(email);
console.log(isValid);
true

Filter var в MySQL

В MySQL есть функции для проверки данных, но они работают внутри запросов.

SELECT 'user@example.com' REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';
1

Основное отличие - в PHP функция filter_var является встроенной и предоставляет единый интерфейс для множества типов фильтрации.

PHP filter_var function comments

En
Filter var Filters a variable with a specified filter