Проверьте метод, ничего не упустил?

Здравствуйте!
Пытаюсь написать класс для очистки данных из полей форм, адресной строки и т.д.
Пока получилось (мне так кажется) разобраться с числами.

метод принимает строку.
Пользователь может допустить опечатку и поставить букву в середине числа, запятую в десятичной дроби (что для многих нормально, разделить цифры пробелами. Всё это метод пытается привести либо к 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, но вдруг я чего-то не знаю и получу потом непонятную для меня ошибку.

Подскажите нет ли здесь ошибок которые мне потом не дадут лёгкой жизни?
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ответы на вопрос 3
TNPTSYWWCC
@TNPTSYWWCC
And I Told Them I Invented Times New Roman
// Убрать пробелы в начале и в конце строки
$int = trim($int);
// Заменить запятую на точку
$int = str_replace(',', '.', $int);

Это стул, стул для сидеть, кружка для пить, небо, трава.
Какой смысл комментировать очевидные вещи?

К чему HTML разметка в сообщении исключения? Тогда уж сразу туда пихай верстку всей страницы ошибки, с стилями. Конкатенация - убогая операция, куда красивее и читабельнее будет использвовать sprinf.

$range = [false, false]
Ну какие false? Ну где логика? Зачем делать массив (никак не типизируемый), вместо банальный двух, разных аргументов с нормальным контролем входящих типов? Ну или хотя бы какой-то типизированный объект...

Не нужно заниматься какой-то ерундой. Чтобы пользователь не ввёл буковки там, где требуется число - на клиенте должно быть поле ввода, не дающее вводить эти самые буковки, имеющее валидацию.
Валидация должна по максимуму быть на клиенте и не позволять отсылать невалидные данные, а если уж сервер и смог как-то получить их - он прямо об этом говорит, а не пытается заниматься бесполезной нормализацией и игрой в гадалку.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега PHP
Тут скорее очень много лишнего.
Начиная с названия.
Почему функция с названием intClean занимается и теми и другими числами?
Зачем вырезать "случайно поставленную букву"? Зачем вообще позволять вводить буквы?
Зачем заменять точку в интах?
Зачем позволять точку в поле, которое требует целое число
Зачем ловить исключение внутри функции?!

Вообще, сама идея что-то "чистить" заведомо провальная.
Не надо ничего чистить. Надо валидировать. проверять на соответствие разрешенному формату.
Да, есть исключения, можно делать трим и заменять запятую.
но все остальные проверки должны тупо вызывать ошибку, а не пытаться как-то подрихтовать заведомо кривое значение.

В общем, надо переделать,
сделать отдельные функции для целых и для плавающей точки.
обе проверять на формат и диапазон
Ответ написан
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Зачем всё это?

$int = (int) $dirty_int;
Выдаст чистый int, если в переданной переменной хоть что-то похожее на число.

filter_var если еще и на range надо проверить
filter_var(
    $yourInteger, 
    FILTER_VALIDATE_INT, 
    [
        'options' => [
            'min_range' => $min, 
            'max_range' => $max
        ]
    ]
);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы