filter_var()
PHP предоставляет встроенные функции для фильтрации и валидации данных. Одна из них — filter_var() для очистки значений.
Введение
filter_var() — встроенный инструмент PHP для валидации и санирования одного значения. Валидация означает проверку того, соответствует ли значение ожидаемому формату (корректный email, целое число в диапазоне, допустимый URL), и возвращает значение при успехе или false при несоответствии. Санирование означает очистку значения путём удаления или экранирования недопустимых символов.
Никогда не доверяйте данным, поступающим извне вашего скрипта — полям форм, строкам запросов, файлам cookie, данным API. Пропуск таких данных через filter_var() перед сохранением, отображением или обработкой — один из простейших способов сделать приложение безопасным и предсказуемым. На этой странице рассматриваются синтаксис, два режима (валидация и санирование), распространённые фильтры и флаги, а также типичные ошибки.
Синтаксис
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed| Параметр | Обязательный | Описание |
|---|---|---|
$value | да | Значение для фильтрации. |
$filter | нет | Идентификатор фильтра, например FILTER_VALIDATE_INT. По умолчанию используется FILTER_DEFAULT, который не выполняет никакой фильтрации. |
$options | нет | Ассоциативный array параметров/флагов или одна константа флага для тонкой настройки фильтра. |
Возвращаемое значение: отфильтрованное (и возможно преобразованное) значение при успехе, или false при ошибке. Обратите внимание, что фильтр валидации возвращает само значение — поэтому всегда используйте === при сравнении, если допустимое значение может быть ложным (например 0 или пустая строка).
Валидация данных
Валидация отвечает на вопрос «да/нет»: приемлемо ли это значение? Фильтр возвращает значение при успехе и false при ошибке.
Валидация email-адреса
Наиболее полезные фильтры валидации:
| Фильтр | Проверяет |
|---|---|
FILTER_VALIDATE_INT | Целое число (опционально в диапазоне min_range/max_range). |
FILTER_VALIDATE_FLOAT | Число с плавающей точкой. |
FILTER_VALIDATE_BOOLEAN | "1", "true", "on", "yes" → true; "0", "false", "off", "no", "" → false. |
FILTER_VALIDATE_EMAIL | Email-адрес. |
FILTER_VALIDATE_URL | URL-адрес. |
FILTER_VALIDATE_IP | Адрес IPv4/IPv6. |
FILTER_VALIDATE_REGEXP | Значение, соответствующее шаблону PCRE. |
Ловушка === false
Поскольку фильтр валидации возвращает значение, результат 0 или "0" является допустимым, но ложным. Всегда используйте строгое сравнение:
Санирование данных
Санирование не отклоняет значение — оно очищает его и возвращает очищенную строку.
Санирование email-адреса
Распространённые фильтры санирования:
| Фильтр | Действие |
|---|---|
FILTER_SANITIZE_EMAIL | Удаляет символы, недопустимые в email. |
FILTER_SANITIZE_URL | Удаляет символы, недопустимые в URL. |
FILTER_SANITIZE_NUMBER_INT | Оставляет цифры и +/-. |
FILTER_SANITIZE_NUMBER_FLOAT | Оставляет цифры, +/-, и (с флагами) .,e. |
FILTER_SANITIZE_SPECIAL_CHARS | HTML-кодирует <, >, &, " и другие символы. |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Аналог htmlspecialchars() с ENT_QUOTES. |
Примечание:
FILTER_SANITIZE_STRINGбыл объявлен устаревшим в PHP 8.1. Для очистки строк при выводе в HTML предпочтительнее использоватьhtmlspecialchars()непосредственно в точке вывода.
Использование параметров и флагов
Третий аргумент позволяет тонко настроить фильтр. Передавайте его в виде array с ключом 'options' (и опционально 'flags'):
Флаги также можно передавать непосредственно в качестве третьего аргумента, когда форма array не нужна:
Валидация и санирование — когда что использовать
- Валидацию — когда нужно принять решение «да/нет»: отклонить запрос, показать ошибку, повторить попытку. Используйте фильтры валидации для email, чисел, URL и IP-адресов в формах и API.
- Санирование — когда необходимо принять входные данные, но нужно очистить их от опасных или лишних символов перед использованием.
- Оба подхода дополняют друг друга — распространённый паттерн: валидировать на входе и экранировать (например, с помощью
htmlspecialchars()) на выходе, не полагаясь только на фильтры санирования.
Типичные ошибки
- Фильтр валидации возвращает значение, а не
true. Сравнивайте с=== falseдля обнаружения ошибки. filter_var()работает с одним скалярным значением. Для фильтрации нескольких значений одновременно используйтеfilter_var_array()или, для данных запросов,filter_input_array().FILTER_VALIDATE_BOOLEANвозвращаетnull(а неfalse) для нераспознанных значений только при передачеFILTER_NULL_ON_FAILURE; в остальных случаях возвращаетсяfalse.- Не полагайтесь на фильтры санирования для критически важного с точки зрения безопасности экранирования вывода — экранируйте в момент рендеринга.
Связанные темы
filter_var_array()— фильтрация множества переменных за один вызов.filter_input_array()— фильтрация данных запроса ($_GET,$_POST).- Валидация форм PHP — применение этих фильтров к реальным формам.
- Валидация URL и Email в PHP
htmlspecialchars()— экранирование для безопасного вывода HTML.trim()— удаление пробелов перед фильтрацией.
Заключение
filter_var() — компактный и надёжный способ валидации и санирования отдельных значений в PHP. Используйте фильтры валидации для принятия или отклонения входных данных, фильтры санирования для их очистки, и не забывайте сравнивать результаты валидации с === false. В сочетании с filter_var_array() для пакетных данных и htmlspecialchars() для вывода это составляет основу безопасной обработки входных данных.