Здравствуйте!
Пытаюсь написать класс для очистки данных из полей форм, адресной строки и т.д.
Пока получилось (мне так кажется) разобраться с числами.
метод принимает строку.
Пользователь может допустить опечатку и поставить букву в середине числа, запятую в десятичной дроби (что для многих нормально, разделить цифры пробелами. Всё это метод пытается привести либо к int либо к float.
Так же написал вспомогательный метод который который контролирует диапазон разрешённых чисел - вдруг пригодится :)
Посмотрите правильно ли я делаю (может вообще лишний огород горожу?)
<?php
namespace cpc\utilites;
class DataCleaner
{
public static function intClean($data, $range = [false, false]) :int|float
{
$value = 0;
// Убрать случайно или специально введённые символы
$pattern = ['/\s/', '/[a-zA-Zа-яА-Я]/'];
$int = preg_replace($pattern, '', $data);
// Убрать пробелы в начале и в конце строки
$int = trim($int);
// Заменить запятую на точку
$int = str_replace(',', '.', $int);
try {
if (is_numeric($int)) {
if (strripos($int, '.')) {
$value = (float) $int;
} else {
$value = (int) $int;
}
var_dump(self::intRange($value, $range));
if(self::intRange($value, $range) === true) {
return $value;
}
throw new \Exception('Здесь ожидается число в диапазоне от ' . $range[0] . ' до ' . $range[1] . '<br>' .
$data . ' не соответствует разрешенному диапахону ');
}
throw new \Exception('Здесь ожидается положительное или отрицательное целое число<br>' .
$data . ' передано с типом ' . gettype($data));
} catch (\Exception $e) {
echo $e->getMessage();
}
return $value;
}
private static function intRange ($value, $range = [false, false]) :bool
{
// меньше минимально разрешенного
if (!is_bool($range[0] and $value < $range[0])) {
return false;
}
// больше максимально разрешенного
if (!is_bool($range[1]) and $value > $range[1]) {
return false;
}
return true;
}
}
вызывается так: DataCleaner::intClean(3 [-1,5])
Что мне пока не нравится:
Ещё толком не умею работать с исключениями. Понимаю, что нужен будет собственный Exception - но я его боюсь.
Плохо разбираюсь с регулярками и пока не придумал как обрать ведущий ноль. Если например пользователь введёт 03. Хотя сейчас метод выдаст 3, но вдруг я чего-то не знаю и получу потом непонятную для меня ошибку.
Подскажите нет ли здесь ошибок которые мне потом не дадут лёгкой жизни?