Ещё раз о filter var / PHP. Особенности и фичи


Очень часто приходится сталкиваться с простейшей задачей — валидацией данных из формы или любых других источников (кукисы, заголовок запроса, etc.) И каждый раз 95% разработчиков городят какие-то неимоверные велосипеды (регулярные выражения, «уникальные» алгоритмы хеширования паролей, etc). И каждый раз мне приходится рассказывать о такой невероятно полезной и нужной функции php — filter_var!

Итак, встречаем, встроенная функция валидации данных.

Эта замечательная функция появилась уже давно, в PHP 5.2.0, но до сих пор, очень малый процент разработчиков применяют её, предпочитая свои велосипеды. И это очень зря, ведь Вы используете готовые фреймворки, ORM и другие инструменты? Так почему Вы не валидируете данные встроенными методами?

Filter_var может проверять и очищать какие угодно данные, от булевых значений, до email и url. Есть 3 типа фильтров:

Так же есть ещё флаги, используемые в фильтрах в качестве третьего параметра функции filter_var. Они нужны для уточнения условий валидности. Сегодня мы рассмотрим фильтры валидации данных подробнее.

Фильтры валидации данных

На момент написания статьи, существовало семь валидирующих фильтров:
  • FILTER_VALIDATE_BOOLEAN — проверяет, что значение является корректным булевым значением. Использует неявное приведение типов. Примеры валидных значений: «1», «true», «on», «yes».
  • FILTER_VALIDATE_EMAIL — проверяет, что значение является корректным email.
  • FILTER_VALIDATE_FLOAT — проверяет, что значение является корректным числом с плавающей точкой.
  • FILTER_VALIDATE_INT — проверяет, что значение является корректным целым числом. Дополнительно можно проверить входит ли значение в определенный диапазон.
  • FILTER_VALIDATE_IP — проверяет, что значение является корректным ip-адресом (v4 или v6). Дополнительно можно проверить, что IP соответствует протоколу IPv4 или IPv6, а также отсутствие вхождения в частные или зарезервированные диапазоны.
  • FILTER_VALIDATE_REGEXP — Проверяет значение на соответствие regexp, Perl-совместимому регулярному выражению.
  • FILTER_VALIDATE_URL — проверяет, что значение является корректным url адресом (в соответствии с RFC 2396).

Для некоторых фильтров можно применить параметры или флаги, за подробностями, обратитесь на страницу документации.

Будьте внимательны!
  • FILTER_VALIDATE_INT
    • Числа +0 и -0 не пройдут проверку на целые числа, но пройдут ее на числа с плавающей точкой.
  • FILTER_VALIDATE_URL
    • Корректная ссылка может не содержать HTTP-протокол , т.е. необходима еще одна проверка, определяющая наличие необходимого протокола у ссылки, например, ssh:// или mailto:.
    • Функция работает только с ASCII-ссылками, таким образом, интернациональные доменные имена (содержащие не-ASCII символы) не пройдут проверку.
  • FILTER_VALIDATE_EMAIL
    • Доменная зона не проверяется на реальность, так что адрес вида [email protected] пройдет валидацию (привет зонам верхнего уровня аля .yandex).

Вот и все. В следующей статье я опишу очищающие фильтры. Далее несколько примеров. Приятного кодинга!

Примеры


<?
// FILTER_VALIDATE_BOOLEAN
filter_var('on', FILTER_VALIDATE_BOOLEAN); // true
filter_var(true, FILTER_VALIDATE_BOOLEAN); // true
filter_var(1, FILTER_VALIDATE_BOOLEAN); // true
filter_var(0, FILTER_VALIDATE_BOOLEAN); // false
filter_var(false, FILTER_VALIDATE_BOOLEAN); // false
filter_var(false, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); // null

// FILTER_VALIDATE_EMAIL
filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // [email protected]
filter_var('d#fh$df%[email protected]', FILTER_VALIDATE_EMAIL); // d#fh$df%[email protected] то есть верно!
filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // [email protected] то есть верно!
filter_var('имя-на-русском@сайтец.рф', FILTER_VALIDATE_EMAIL); // false
filter_var('<script>;alert("okay");</script>@site.b', FILTER_VALIDATE_EMAIL); // false

// FILTER_VALIDATE_FLOAT
filter_var(1, FILTER_VALIDATE_FLOAT); // 1
filter_var(0, FILTER_VALIDATE_FLOAT); // 0
filter_var(1.1, FILTER_VALIDATE_FLOAT); // 1.1
filter_var(true, FILTER_VALIDATE_FLOAT); // 1
filter_var(
	'1,1',
	FILTER_VALIDATE_FLOAT,
	array('options' => array('decimal' => ','))
); // 1.1
filter_var('1,1', FILTER_VALIDATE_FLOAT); // false
filter_var('1,000,000', FILTER_VALIDATE_FLOAT); // false
filter_var('1,000,000', FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_THOUSAND); // 1000000

// FILTER_VALIDATE_INT
filter_var(1, FILTER_VALIDATE_INT); // 1
filter_var(0, FILTER_VALIDATE_INT); // 0
filter_var(true, FILTER_VALIDATE_INT); // 1
filter_var('3', FILTER_VALIDATE_INT); // 3
filter_var('3.2', FILTER_VALIDATE_INT); // false
filter_var(
	22,
	FILTER_VALIDATE_INT,
	array('options' => array('min_range' => 30))
); // false
filter_var(
	32,
	FILTER_VALIDATE_INT,
	array('options' => array('min_range' => 30))
); // 32
// FILTER_FLAG_ALLOW_OCTAL
filter_var(032, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL); // 26
// FILTER_FLAG_ALLOW_HEX
filter_var(0x32, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX); // 50

// FILTER_VALIDATE_IP
filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP); // 127.0.0.1
filter_var('10.0.0.0', FILTER_VALIDATE_IP); // 10.0.0.0
// FILTER_FLAG_IPV6
filter_var('10.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); // false
filter_var(
	'2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d',
	FILTER_VALIDATE_IP,
	FILTER_FLAG_IPV6
); // 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
// FILTER_FLAG_NO_PRIV_RANGE
filter_var('10.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // false
filter_var('33.35.73.255', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // 33.35.73.255
// FILTER_FLAG_NO_RES_RANGE
filter_var('0.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); // false
filter_var('10.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); // 10.0.0.0

// FILTER_VALIDATE_REGEXP
filter_var(
	'hello world',
	FILTER_VALIDATE_REGEXP,
	array('options'=>array('regexp'=>'/^h/is'))
); // hello world
filter_var(
	'world hello',
	FILTER_VALIDATE_REGEXP,
	array('options'=>array('regexp'=>'/^h/is'))
); // false
filter_var(
	'hello world',
	FILTER_VALIDATE_REGEXP,
	array('options'=>array('regexp'=>'/[0-9]+/is'))
); // false
filter_var(
	'22 543 24',
	FILTER_VALIDATE_REGEXP,
	array('options'=>array('regexp'=>'/[0-9]+/is'))
); // 22 543 24

// FILTER_VALIDATE_URL
filter_var('http://somesite.com', FILTER_VALIDATE_URL); // http://somesite.com
filter_var('http://какой-то-сайт.рф', FILTER_VALIDATE_URL); // false
filter_var('http://#%$%#^^.com', FILTER_VALIDATE_URL); // false
filter_var('somesite.com', FILTER_VALIDATE_URL); // false
filter_var('torrent://somesite.com', FILTER_VALIDATE_URL); // torrent://somesite.com
// FILTER_FLAG_PATH_REQUIRED
filter_var(
	'http://somesite.com',
	FILTER_VALIDATE_URL,
	FILTER_FLAG_PATH_REQUIRED
); // false
filter_var(
	'http://somesite.com/test',
	FILTER_VALIDATE_URL,
	FILTER_FLAG_PATH_REQUIRED
); // http://somesite.com/test
// FILTER_FLAG_QUERY_REQUIRED
filter_var(
	'http://somesite.com',
	FILTER_VALIDATE_URL,
	FILTER_FLAG_QUERY_REQUIRED
); // false
filter_var(
	'http://somesite.com?test',
	FILTER_VALIDATE_URL,
	FILTER_FLAG_QUERY_REQUIRED
); // http://somesite.com?test
// FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED
filter_var(
	'http://somesite.com/test?test',
	FILTER_VALIDATE_URL,
	FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_QUERY_REQUIRED
); // http://somesite.com?test
?>