filter_id()
Как функция filter_id() в PHP преобразует имя фильтра в числовой ID: синтаксис, возвращаемые значения, примеры и типичные ошибки.
Введение
filter_id() — небольшая, но удобная функция PHP, которая выполняет одну задачу: принимает имя фильтра (строку вида "validate_email") и возвращает числовой ID этого фильтра — целое число, которое на самом деле хранится за константами FILTER_VALIDATE_EMAIL, FILTER_SANITIZE_STRING и им подобными.
По сути, она является обратной к filter_list(), которая возвращает список имён фильтров. К filter_id() обращаются тогда, когда имя фильтра задано в виде строки — как правило, из конфигурации, базы данных или пользовательского ввода — и нужно получить целое число, которое ожидают filter_var() и filter_input().
На этой странице рассматриваются синтаксис, возвращаемые значения, работающий пример и наиболее распространённая ошибка при использовании функции.
Синтаксис
filter_id(string $name): int|falseФункция принимает один параметр:
$name— имя фильтра в виде строки, например"validate_int","validate_email","sanitize_email". Это строчные имена, возвращаемыеfilter_list(), а не имена константFILTER_*.
Функция возвращает целочисленный ID совпавшего фильтра или false, если фильтр с таким именем не найден.
Передавайте имя фильтра, а не имя константы
Именно здесь чаще всего ошибаются. Аргументом является короткое строчное имя фильтра — не константа FILTER_VALIDATE_EMAIL и не строка "FILTER_VALIDATE_EMAIL".
<?php
var_dump(filter_id('validate_email')); // int(274) ✅ correct name
var_dump(filter_id('FILTER_VALIDATE_EMAIL')); // bool(false) ❌ that is the constant, not the name
var_dump(filter_id('not_a_real_filter')); // bool(false) ❌ unknown nameПоскольку неизвестное имя возвращает false, всегда проверяйте результат перед его использованием в качестве ID фильтра. В противном случае значение false будет молча приведено к 0, если передать его туда, где ожидается целое число.
Практический пример
Реальный сценарий использования: пользователь выбирает правило валидации по имени (из формы, конфигурационного файла или API-запроса), и его нужно применить динамически. filter_id() превращает это имя в ID, который требуется filter_var().
<?php
$ruleName = 'validate_email'; // could come from user input or config
$value = '[email protected]';
$filterId = filter_id($ruleName);
if ($filterId === false) {
echo "Unknown filter: $ruleName";
} elseif (filter_var($value, $filterId) !== false) {
echo "'$value' passed the '$ruleName' filter (id $filterId).";
} else {
echo "'$value' failed the '$ruleName' filter.";
}
// Output: '[email protected]' passed the 'validate_email' filter (id 274).Обратите внимание на строгую проверку === false: корректный фильтр, например int, имеет ID 257, который является истинным, однако использование нестрогой проверки на истинность всё равно неправильно обработало бы неизвестный фильтр. Явное сравнение с false позволяет чётко разграничить оба случая.
Поиск допустимых имён фильтров
Чтобы узнать, какие именно имена принимает filter_id(), выполните итерацию по результату filter_list():
<?php
foreach (filter_list() as $name) {
echo $name . ' => ' . filter_id($name) . PHP_EOL;
}
// int => 257
// boolean => 258
// validate_email => 274
// validate_url => 273
// sanitize... and so onКогда применять
- Динамическая валидация — когда применяемый фильтр определяется во время выполнения из строки.
- Сопоставление конфигурации с фильтрами — преобразование понятных человеку имён правил из конфигурационного файла в ID, которые требуются
filter_var()/filter_input(). - Интроспекция / инструментарий — вывод списка доступных фильтров и их ID.
Если фильтр известен на этапе написания кода, не используйте filter_id() — применяйте константу напрямую (filter_var($email, FILTER_VALIDATE_EMAIL)): это нагляднее и исключает лишний поиск.
Связанные функции
filter_list()— получить все поддерживаемые имена фильтров.filter_var()— отфильтровать одну переменную по ID фильтра.filter_input()— отфильтровать значение из источника ввода.php-filters— обзор расширения фильтров PHP.