Rogério Lino

Web development and tips

PHP: Validate Filters

A partir do PHP 5.2 foi introduzida a função filter_var. Que serve justamente para filtrar uma variável a partir de um filtro especificado.

1
2
mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )
// Returns the filtered data, or FALSE if the filter fails.

Filtros pré-definidos:

1
2
3
4
5
6
7
8
9
10
11
// email filtering
echo filter_var('email@domain.com', FILTER_VALIDATE_EMAIL); // email@domain.com
echo filter_var('domain.com', FILTER_VALIDATE_EMAIL); // false

// url filtering
echo filter_var('http://rogeriolino.com', FILTER_VALIDATE_URL); // http://rogeriolino.com
echo filter_var('rogeriolino.com', FILTER_VALIDATE_URL); // false

// ip filtering
echo filter_var('127.0.0.1', FILTER_VALIDATE_IP); // 127.0.0.1
echo filter_var('127.0.1', FILTER_VALIDATE_IP); // false

Como a função pode retornar FALSE (caso o filtro falhe) ou o valor filtrado. Podemos utilizar o Not identical operator (!==) para verificar se retorno é realmente FALSE, ou seja, o valor testado não passou pelo filtro.

Colocando em prática a função mais orientação à objetos para criar algumas classes validadoras:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
 * Interface Validator 
 */
interface Validator {

    public function isValid($value);

}

/**
 * Abstract class Simple Validator
 */
abstract class SimpleValidator implements Validator {

    protected abstract function defaultFilter();

    public function isValid($value) {
        return filter_var($value, $this->defaultFilter()) !== false;
    }

}

/**
 * Simple Email validator 
 */
class EmailValidator extends SimpleValidator {

    protected function defaultFilter() {
        return FILTER_VALIDATE_EMAIL;
    }

}

/**
 * Simple URL validator 
 */
class UrlValidator extends SimpleValidator {

    protected function defaultFilter() {
        return FILTER_VALIDATE_URL;
    }

}

/**
 * Simple IP Validator 
 */
class IpValidator extends SimpleValidator {

    protected function defaultFilter() {
        return FILTER_VALIDATE_IP;
    }

}

Testando

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// email validating
$validator = new EmailValidator();
echo $validator->isValid('rogeriolino@com'); // false
echo $validator->isValid('contact@rogeriolino.com'); // true
echo $validator->isValid('contact+spam@rogeriolino.com'); // true

// URL validating
$validator = new UrlValidator();
echo $validator->isValid('http://rogeriolino.com'); // true
echo $validator->isValid('http://rogeriolino.com/contact'); // true
echo $validator->isValid('rogeriolino.com/contact'); // false
echo $validator->isValid('https://rogeriolino'); // true
echo $validator->isValid('ftp://rogeriolino.com'); // true

// URL validating
$validator = new IpValidator();
echo $validator->isValid('127.0.0.1'); // true
echo $validator->isValid('127.0.0'); // false
echo $validator->isValid('1050:0000:0000:0000:0005:0600:300c:326b'); // true
echo $validator->isValid('1050:0000:0000:0000:0005:0600'); // false

Para ver outros filtros: http://php.net/manual/filter.filters.validate.php

Comments