Разработка на PHP: Как написать универсальную функцию clean($variable), которая будет корректно обрабатывать строки, целые числа и числа с плавающей точкой, очищая их от лишних символов?
Универсальная функция clean($variable) в PHP должна уметь определять тип переданного значения и применять соответствующую стратегию очистки. Рассмотрим подробную реализацию.
## Базовая реализация
php
function clean($variable) {
if (is_int($variable)) {
return (int) filter_var($variable, FILTER_SANITIZE_NUMBER_INT);
}
if (is_float($variable)) {
return (float) filter_var($variable, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
}
if (is_string($variable)) {
$variable = trim($variable);
$variable = stripslashes($variable);
$variable = htmlspecialchars($variable, ENT_QUOTES | ENT_HTML5, ‘UTF-8’);
return $variable;
}
return $variable;
}
## Что делает каждый блок
**Для целых чисел (int):** используется фильтр `FILTER_SANITIZE_NUMBER_INT`, который удаляет все символы, кроме цифр, знаков плюс и минус. Результат явно приводится к типу `int`.
**Для чисел с плавающей точкой (float):** применяется `FILTER_SANITIZE_NUMBER_FLOAT` с флагом `FILTER_FLAG_ALLOW_FRACTION`, что позволяет сохранить десятичную точку. Результат приводится к `float`.
**Для строк (string):** выполняется тройная обработка:
— `trim()` — удаляет пробелы и спецсимволы с обоих концов;
— `stripslashes()` — убирает экранирующие обратные слеши;
— `htmlspecialchars()` — преобразует спецсимволы HTML в сущности, защищая от XSS-атак.
## Расширенная версия с поддержкой массивов
php
function clean($variable) {
if (is_array($variable)) {
return array_map(‘clean’, $variable);
}
if (is_int($variable)) {
return (int) filter_var($variable, FILTER_SANITIZE_NUMBER_INT);
}
if (is_float($variable)) {
return (float) filter_var(
$variable,
FILTER_SANITIZE_NUMBER_FLOAT,
FILTER_FLAG_ALLOW_FRACTION
);
}
if (is_string($variable)) {
return htmlspecialchars(
stripslashes(trim($variable)),
ENT_QUOTES | ENT_HTML5,
‘UTF-8’
);
}
return $variable;
}
## Обработка строк, содержащих числа
Если строка передана как `» 3.14abc «`, функция в блоке строк вернёт экранированное значение. Если нужно дополнительно извлекать числа из строк, добавьте:
php
if (is_string($variable) && is_numeric(trim($variable))) {
return strpos(trim($variable), ‘.’) !== false
? (float) trim($variable)
: (int) trim($variable);
}
## Важные замечания
1. **Не используйте функцию для паролей** — `htmlspecialchars` изменяет содержимое, что нарушает хеширование.
2. **Для SQL-запросов** дополнительно применяйте подготовленные выражения (PDO/MySQLi), а не только clean().
3. **Для JSON и XML** потребуется отдельная логика очистки.
4. Функция поддерживает **UTF-8** по умолчанию, что критично для кириллицы и других многобайтовых кодировок.
Такая реализация покрывает большинство сценариев веб-разработки и обеспечивает базовую защиту от инъекций и XSS.
