Note: FILTER_NULL_ON_FAILURE, FILTER_REQUIRE_SCALAR, FILTER_REQUIRE_ARRAY and FILTER_FORCE_ARRAY dont have prefix "FILTER_FLAG_" but they are FLAGS!Следующие константы определяются модулем и доступны, только если модуль либо собрали в PHP, либо динамически загрузили при выполнении кода.
Следующие константы указывают при вызове функций filter_input() и filter_input_array().
INPUT_POST
(int)
Переменные суперглобального массива POST.
INPUT_GET
(int)
Переменные суперглобального массива GET.
Переменные суперглобального массива COOKIE.
INPUT_ENV
(int)
Переменные суперглобального массива ENV.
INPUT_SERVER
(int)
Переменные суперглобального массива SERVER.
INPUT_SESSION
(int)
Переменные суперглобального массива SESSION. Константу удалили с PHP 8.0.0; прежде константа оставалась в исходном коде, но не обрабатывалась функциями фильтрации.
INPUT_REQUEST
(int)
Переменные REQUEST. Константу удалили с PHP 8.0.0; прежде константа оставалась в исходном коде, но не обрабатывалась функциями фильтрации.
FILTER_FLAG_NONE
(int)
Не применять флаги.
FILTER_REQUIRE_SCALAR
(int)
Проверять, принадлежит ли входное значение скалярному типу.
FILTER_REQUIRE_ARRAY
(int)
Проверять, принадлежит ли входное значение типу array.
FILTER_FORCE_ARRAY
(int)
Оборачивать скалярные входные данные в одноэлементный массив (array) для фильтров, которые обрабатывают массивы.
FILTER_NULL_ON_FAILURE
(int)
Фильтр возвращает null вместо false, если значение не прошло проверку.
Флаг указывают при проверке значений фильтрами семейства
FILTER_VALIDATE_*.
FILTER_THROW_ON_FAILURE
(int)
Флаг устанавливает режим фильтрации, в котором вместо возврата значения false
модуль выбрасывает исключение Filter\FilterFailedException,
когда значение не проходит проверку.
Флаг указывают при проверке значений фильтрами семейства
FILTER_VALIDATE_*.
Флаг доступен с PHP 8.5.0.
FILTER_FLAG_STRIP_LOW
(int)
Удалять символы с ASCII-кодами меньше 32.
FILTER_FLAG_STRIP_HIGH
(int)
Удалять символы с ASCII-кодами больше 127.
FILTER_FLAG_STRIP_BACKTICK
(int)
Удалять символы обратной кавычки `.
FILTER_FLAG_ENCODE_LOW
(int)
Кодировать символы с ASCII-кодами меньше 32.
FILTER_FLAG_ENCODE_HIGH
(int)
Кодировать символы с ASCII-кодами больше 127.
FILTER_FLAG_ENCODE_AMP
(int)
Кодировать символ амперсанда &.
FILTER_FLAG_NO_ENCODE_QUOTES
(int)
Отключить кодирование одинарных ' и двойных "
кавычек для отдельных фильтров.
FILTER_FLAG_EMPTY_STRING_NULL
(int)
Преобразовывать значение в null,
если очистка строки возвращает пустую строку.
FILTER_VALIDATE_BOOL
(int)
Фильтр возвращает true для следующих значений: "1";
1, включая двоичную, восьмеричную и шестнадцатеричную нотации; 1.0, включая научную нотацию;
"true" и true;
"on" и "yes".
Фильтр возвращает false для следующих значений: "0";
0, включая двоичную, восьмеричную и шестнадцатеричную нотации; 0.0, включая научную нотацию;
"false" и false;
"off" и "no";
"".
Строковые значения сравнивают без учёта регистра.
С флагом FILTER_NULL_ON_FAILURE функция
изменяет значение результата проверки нелогических значений.
При установке флага вместо возврата значения false для нелогических значений функция возвращает значение null.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
Фильтр доступен с PHP 8.0.0.
FILTER_VALIDATE_BOOLEAN
(int)
Псевдоним фильтра FILTER_VALIDATE_BOOL. Псевдоним оставался
базовым названием фильтра проверки логических значений, пока в PHP 8.0.0 не ввели каноническое название.
FILTER_VALIDATE_INT
(int)
Фильтр проверяет, представляет ли значение целое число, и приводит значение к типу int, если значение прошло проверку.
Замечание:
Строковые значения обрезаются функцией trim() перед проверкой.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
min_rangeЗначение пройдёт проверку, только если оно больше заданного значения или равно ему.
max_rangeЗначение пройдёт проверку, только если оно меньше заданного значения или равно ему.
FILTER_FLAG_ALLOW_OCTAL
(int)
Пропускает целочисленные значения в восьмеричной нотации,
которая соответствует шаблону 0[0-7]+.
FILTER_FLAG_ALLOW_HEX
(int)
Пропускает целочисленные значения в шестнадцатеричной нотации,
которая соответствует шаблону 0x[0-9a-fA-F]+.
FILTER_VALIDATE_FLOAT
(int)
Фильтр проверяет, представляет ли значение число с плавающей точкой, и приводит значение к типу float, если значение прошло проверку.
Замечание:
Строковые значения обрезаются функцией trim() перед проверкой.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
decimal
min_rangeЗначение пройдёт проверку, только если оно больше заданного значения или равно ему. Опция доступна с PHP 7.4.0.
max_rangeЗначение пройдёт проверку, только если оно меньше заданного значения или равно ему. Опция доступна с PHP 7.4.0.
FILTER_FLAG_ALLOW_THOUSAND
(int)
Флаг разрешает фильтру пропускать значения с запятыми ,,
которыми часто отбивают тысячи.
FILTER_VALIDATE_REGEXP
(int)
Фильтр проверяет, соответствует ли значение регулярному выражению,
которое указали в опции regexp.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
regexpPerl-совместимые регулярные выражения.
FILTER_VALIDATE_URL
(int)
Фильтр проверяет, соответствует ли URL-адрес стандарту » RFC 2396.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
FILTER_FLAG_SCHEME_REQUIRED
(int)
Проверять, содержит ли URL-адрес схему ресурса.
Флаг УСТАРЕЛ с PHP 7.3.0,
а с PHP 8.0.0 флаг УДАЛИЛИ,
поскольку фильтр FILTER_VALIDATE_URL
и без того проверяет, содержит ли адрес схему.
FILTER_FLAG_HOST_REQUIRED
(int)
Проверять, содержит ли URL-адрес хост.
Флаг УСТАРЕЛ с PHP 7.3.0,
а с PHP 8.0.0 флаг УДАЛИЛИ,
поскольку фильтр FILTER_VALIDATE_URL
и без того проверяет, содержит ли адрес хост.
FILTER_FLAG_PATH_REQUIRED
(int)
Проверять, содержит ли URL-адрес путь.
FILTER_FLAG_QUERY_REQUIRED
(int)
Проверять, содержит ли URL-адрес аргументы запроса.
К допустимым URL-адресам относятся не только ресурсы
со схемой http://, которая определяет HTTP-протокол,
поэтому иногда требуется дополнительная проверка, которая определит,
содержит ли URL-адрес конкретный протокол
наподобие ssh:// или идентификатор схемы наподобие mailto:.
Фильтр проверяет только URL-адреса, которые состоят из ASCII-символов, поэтому отклоняет международные доменные имена (англ. Internationalized Domain Names, IDN).
FILTER_VALIDATE_DOMAIN
(int)
Фильтр проверяет, соответствует ли доменное имя стандартам » RFC 952, » RFC 1034, » RFC 1035, » RFC 1123, » RFC 2732 и » RFC 2181.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
FILTER_FLAG_HOSTNAME
(int)
Проверять, начинается ли имя хоста с буквенно-цифрового символа и содержит только буквы, цифры или дефисы.
FILTER_VALIDATE_EMAIL
(int)
Фильтр проверяет, «допустим» ли адрес эл. почты.
Фильтр проверяет, соответствует ли почтовый адрес синтаксису спецификации addr-spec
по стандарту
» RFC 822.
Фильтр не поддерживает комментарии, свёртывание пробельных символов и домены без точек,
поэтому отклоняет такие адреса.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
FILTER_FLAG_EMAIL_UNICODE
(int)
Флаг разрешает фильтру принимать символы Юникода в локальной части адреса, которая идёт перед символом @. Флаг доступен с PHP 7.1.0.
Проверка адреса эл. почты сложна, и единственный надёжный способ подтвердить корректность и доступность адреса — отправить электронное письмо адресату.
FILTER_VALIDATE_IP
(int)
Фильтр проверяет значение как IP-адрес.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
FILTER_FLAG_IPV4
(int)
Разрешает IPv4-адреса.
FILTER_FLAG_IPV6
(int)
Разрешает IPv6-адреса.
FILTER_FLAG_NO_RES_RANGE
(int)
Запрещает зарезервированные адреса.
К зарезервированным относятся адреса диапазонов, которые
в стандарте » RFC 6890
пометили атрибутом Reserved-By-Protocol.
Зарезервированные IPv4-адреса соответствуют следующим диапазонам:
0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8, 240.0.0.0/4.
Зарезервированные IPv6-адреса соответствуют следующим диапазонам:
::1/128, ::/128, ::FFFF:0:0/96, FE80::/10.
FILTER_FLAG_NO_PRIV_RANGE
(int)
Запрещает частные адреса.
К частным относятся IPv4-адреса в следующих диапазонах:
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.
К частным относятся IPv6-адреса, которые начинаются
на FD или FC.
FILTER_FLAG_GLOBAL_RANGE
(int)
Разрешает только глобальные адреса.
Для глобальных адресов стандарт
» RFC 6890 устанавливает
в атрибуте Global значение True.
Флаг доступен с PHP 8.2.0.
FILTER_VALIDATE_MAC
(int)
Фильтр проверяет, соответствует ли значение MAC-адресу.
defaultЗначение, которое вернёт фильтр, если входные данные не пройдут проверку.
FILTER_UNSAFE_RAW
(int)
Фильтр ничего не проверяет.
При этом фильтр удалит или закодирует спецсимволы, если работает
совместно с флагами очистки из семейства FILTER_FLAG_STRIP_*
или FILTER_FLAG_ENCODE_*.
FILTER_DEFAULT
(int)
Псевдоним фильтра FILTER_UNSAFE_RAW.
FILTER_SANITIZE_STRING
(int)
Фильтр удаляет теги и кодирует двойные и одинарные кавычки в числовые HTML-сущности.
Фильтр дополнительно удалит или закодирует символы, если работает
совместно с флагами очистки из семейства FILTER_FLAG_STRIP_*
или FILTER_FLAG_ENCODE_*.
Флаг FILTER_FLAG_NO_ENCODE_QUOTES
отключает кодирование кавычек.
Фильтр устарел с PHP 8.1.0, вместо него спецсимволы преобразовывают функцией htmlspecialchars().
Фильтр и функция strip_tags() удаляют теги по-разному.
FILTER_SANITIZE_STRIPPED
(int)
Псевдоним фильтра FILTER_SANITIZE_STRING.
Фильтр устарел с PHP 8.1.0, вместо него спецсимволы преобразовывают функцией htmlspecialchars().
FILTER_SANITIZE_ENCODED
(int)
Фильтр кодирует строку для безопасного включения в состав URL-адреса.
Фильтр дополнительно удалит или закодирует символы, если работает
совместно с флагами очистки из семейства FILTER_FLAG_STRIP_*
или FILTER_FLAG_ENCODE_*.
FILTER_SANITIZE_SPECIAL_CHARS
(int)
Фильтр преобразовывает в числовые HTML-сущности символы
', ", <, >, &
и символы с ASCII-кодами меньше 32.
Фильтр FILTER_SANITIZE_SPECIAL_CHARS игнорирует
флаг FILTER_FLAG_NO_ENCODE_QUOTES,
в отличие от фильтра FILTER_SANITIZE_FULL_SPECIAL_CHARS.
Фильтр дополнительно удалит символы, если работает
совместно с флагами очистки из семейства FILTER_FLAG_STRIP_*,
и закодирует символы с ASCII-кодами
больше 127 при установке флага FILTER_FLAG_ENCODE_HIGH.
FILTER_SANITIZE_FULL_SPECIAL_CHARS
(int)
Поведение фильтра аналогично вызову функции htmlspecialchars()
с флагом ENT_QUOTES.
Флаг FILTER_FLAG_NO_ENCODE_QUOTES
отключает кодирование кавычек.
Аналогично функции htmlspecialchars() фильтр учитывает настройку INI-директивы default_charset. Входная строка отклоняется, и фильтр возвращает пустую строку, если последовательность байтов невозможно декодировать в допустимый символ в текущем наборе символов.
FILTER_SANITIZE_EMAIL
(int)
Фильтр очищает строку путём удаления всех символов,
кроме латинских букв, которые соответствуют шаблону [a-zA-Z],
цифр, которые совпадают с шаблоном [0-9],
и спецсимволов
!#$%&'*+-=?^_`{|}~@.[].
FILTER_SANITIZE_URL
(int)
Фильтр очищает строку путём удаления всех символов,
кроме латинских букв, которые соответствуют шаблону [a-zA-Z],
цифр, которые совпадают с шаблоном [0-9],
и спецсимволов
$-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
FILTER_SANITIZE_NUMBER_INT
(int)
Фильтр очищает строку путём удаления всех символов,
кроме цифр, которые соответствуют шаблону [0-9], знаков сложения и вычитания:
+ и -.
FILTER_SANITIZE_NUMBER_FLOAT
(int)
Фильтр очищает строку путём удаления всех символов,
кроме цифр, которые соответствуют шаблону [0-9], знаков сложения и вычитания:
+ и -.
FILTER_FLAG_ALLOW_FRACTION
(int)
Флаг разрешает фильтру пропускать символ .
как стандартный разделитель целой
и дробной частей.
FILTER_FLAG_ALLOW_THOUSAND
(int)
Флаг разрешает фильтру пропускать символ ,
как стандартный разделитель тысяч.
FILTER_FLAG_ALLOW_SCIENTIFIC
(int)
Пропускает числа в научной нотации
с символами e и E.
Без флага FILTER_FLAG_ALLOW_FRACTION
фильтр удаляет десятичный разделитель, чем изменяет входное значение.
<?php
$number = '12.34';
var_dump(filter_var($number, FILTER_SANITIZE_NUMBER_FLOAT));
var_dump(filter_var($number, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));Результат выполнения приведённого примера:
string(4) "1234" string(5) "12.34"
FILTER_SANITIZE_ADD_SLASHES
(int)
Фильтр применяет функцию addslashes() ко входным данным. Фильтр доступен с PHP 7.3.0.
FILTER_SANITIZE_MAGIC_QUOTES
(int)
Псевдоним фильтра FILTER_SANITIZE_ADD_SLASHES.
Фильтр УСТАРЕЛ с PHP 7.3.0, а с PHP 8.0.0 фильтр УДАЛИЛИ.
FILTER_CALLBACK
(int)
Фильтр делегирует фильтрацию пользовательской функции.
Выражение callable передаётся
через параметр options как значение, связанное
с ключом 'options'.
Сигнатура callback-функции:
valueЗначение для фильтрации.
Замечание:
Значение возврата callback-функции вернётся как значение возврата из функции фильтрации.
Пример #1
Пример проверки имени пользователя фильтром FILTER_CALLBACK
<?php
function validate_login(string $value): ?string
{
if (strlen($value) >= 5 && ctype_alnum($value)) {
return $value;
}
return null;
}
$login = "val1dL0gin";
$filtered_login = filter_var($login, FILTER_CALLBACK, ['options' => 'validate_login']);
var_dump($filtered_login);
$login = "f&ke login";
$filtered_login = filter_var($login, FILTER_CALLBACK, ['options' => 'validate_login']);
var_dump($filtered_login);Результат выполнения приведённого примера:
string(10) "val1dL0gin" NULL
Фильтр нельзя комбинировать с флагами,
включая флаг FILTER_NULL_ON_FAILURE.
Note: FILTER_NULL_ON_FAILURE, FILTER_REQUIRE_SCALAR, FILTER_REQUIRE_ARRAY and FILTER_FORCE_ARRAY dont have prefix "FILTER_FLAG_" but they are FLAGS!<?php
+ // Handle FILTER_FLAG_STRIP_BACKTICK
+ // Fixes bug PHP_VERSION < 5.5.24
+ if ($flags & FILTER_FLAG_STRIP_BACKTICK) {
+ $output = str_replace('`', '', $output);
+ }
?>
Revised version:
<?php
function filter_sanitize_string(mixed $value, int $flags = 0): string|false|null {
if ($flags & FILTER_FLAG_EMPTY_STRING_NULL && $value === "") {
return null;
}
if (!(is_scalar($value) || is_null($value))) {
return false;
}
// Strip HTML tags and remove NUL bytes
$value = (string)$value;
$value = strip_tags($value);
$value = str_replace("\0", "", $value);
// High/Low ASCII handling (Byte-by-byte to match legacy behavior)
$output = "";
for ($i = 0, $n = strlen($value); $i < $n; $i++) {
$char = $value[$i];
$ord = ord($char);
if ($ord < 32) {
if ($flags & FILTER_FLAG_STRIP_LOW) continue;
if ($flags & FILTER_FLAG_ENCODE_LOW) {
$output .= "&#$ord;"; // Legacy decimal encoding
continue;
}
}
if ($ord > 127) {
if ($flags & FILTER_FLAG_STRIP_HIGH) continue;
if ($flags & FILTER_FLAG_ENCODE_HIGH) {
$output .= "&#$ord;"; // This turns © into © (©)
continue;
}
}
$output .= $char;
}
// Strip backticks
// Fixes bug PHP_VERSION < 5.5.24
if ($flags & FILTER_FLAG_STRIP_BACKTICK) {
$output = str_replace('`', '', $output);
}
// Legacy ONLY encoded ampersands if FILTER_FLAG_ENCODE_AMP was set
if ($flags & FILTER_FLAG_ENCODE_AMP) {
$output = str_replace('&', '&', $output);
}
// Replicate legacy quote encoding exactly (' and ")
if (!($flags & FILTER_FLAG_NO_ENCODE_QUOTES)) {
$output = str_replace(["'", '"'], [''', '"'], $output);
}
return $output;
}We can add FILTER_FLAG_EMPTY_STRING_NULL:
<?php
- function filter_sanitize_string(mixed $value, int $flags = 0): string|false {
+ function filter_sanitize_string(mixed $value, int $flags = 0): string|false|null {
+ if ($flags & FILTER_FLAG_EMPTY_STRING_NULL && $value === "") {
+ return null;
+ }
?>
For FILTER_FLAG_STRIP_BACKTICK, there is a bug history
(https://bugs.php.net/bug.php?id=69202)
so I did not attempt to code compatility through version history.We're all looking for a polyfill to replace the FILTER_SANITIZE_STRING flag, deprecated as of PHP 8.1.0,
that behaves exactly the same for scalar and non-scalar values.
(Using htmlspecialchars() and strip_tags() are not returning exactly the same output.)
<?php
function filter_sanitize_string(mixed $value, int $flags = 0): string|false {
if (!(is_scalar($value) || is_null($value))) {
return false;
}
// Strip HTML tags and remove NUL bytes
$value = (string)$value;
$value = strip_tags($value);
$value = str_replace("\0", "", $value);
// High/Low ASCII handling (Byte-by-byte to match legacy behavior)
$output = "";
for ($i = 0, $n = strlen($value); $i < $n; $i++) {
$char = $value[$i];
$ord = ord($char);
if ($ord < 32) {
if ($flags & FILTER_FLAG_STRIP_LOW) continue;
if ($flags & FILTER_FLAG_ENCODE_LOW) {
$output .= "&#$ord;"; // Legacy decimal encoding
continue;
}
}
if ($ord > 127) {
if ($flags & FILTER_FLAG_STRIP_HIGH) continue;
if ($flags & FILTER_FLAG_ENCODE_HIGH) {
$output .= "&#$ord;"; // This turns © into © (©)
continue;
}
}
$output .= $char;
}
// Legacy ONLY encoded & if FILTER_FLAG_ENCODE_AMP was set.
if ($flags & FILTER_FLAG_ENCODE_AMP) {
$output = str_replace('&', '&', $output);
}
// Replicate legacy quote encoding exactly (' and ")
if (!($flags & FILTER_FLAG_NO_ENCODE_QUOTES)) {
$output = str_replace(["'", '"'], [''', '"'], $output);
}
return $output;
}
// Tests
$string = "It's a \"test\" \x02 <script> > & ©";
// Deprecated example:
$sanitized = filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH);
var_dump($sanitized);
// Polyfill example:
$sanitized = filter_sanitize_string($string, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH);
var_dump($sanitized);
// Polyfill in filter_var() callback:
$sanitized = filter_var($string, FILTER_CALLBACK, [
'options' => function($value) {
return filter_sanitize_string($value, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH);
}
]);
var_dump($sanitized);
?>
Output:
string(44) "It's a "test" > & ©"
string(44) "It's a "test" > & ©"
string(44) "It's a "test" > & ©"