Filter functies, de nieuwe manier van valideren in PHP

Sinds PHP 5.3 zijn er filter functies beschikbaar. Er zijn twee soorten filters:

Validate filters

Validatie filters worden gebruikt om te controleren of een waarde voldoet aan bepaalde voorwaarden.

boolean

if (filter_var($boolean, FILTER_VALIDATE_BOOLEAN)) { // true }

email

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { // true }

float

if (filter_var($float, FILTER_VALIDATE_FLOAT)) { // true }

int

if (filter_var($int, FILTER_VALIDATE_INT)) { // true }
if (filter_var($year, FILTER_VALIDATE_INT, array('min_range'=> 2010, 'max_range' => 2015))) { // true }

validate_ip

if (filter_var($ip_address, FILTER_VALIDATE_IP)) { // true }

validate_regexp

if (filter_var($value, FILTER_VALIDATE_REGEXP, array('options' => array('regexp => $expression)))) { // true }

validate_url

if (filter_var($url, FILTER_VALIDATE_URL)) { // true }

Sanitize filters

Sanering filters worden gebruikt om ongewenste karakters te verwijderen.

email

Remove all characters except letters, digits and !#$%&'*+-/=?^_`{|}~@.[].

$value = filter_var($email, FILTER_SANITIZE_EMAIL);

encoded

URL-encode string, optionally strip or encode special characters.

$value = filter_var($url, FILTER_SANITIZE_ENCODED);

magic_quotes

$value = filter_var($string, FILTER_SANITIZE_MAGIC_QUOTES);

number_float

Remove all characters except digits, +- and optionally .,eE.

$value = filter_var($float, FILTER_SANITIZE_NUMBER_FLOAT);

number_int

Remove all characters except digits, plus and minus sign.

$value = filter_var($int, FILTER_SANITIZE_NUMBER_INT);

special_chars

HTML-escape '"<>& and characters with ASCII value less than 32, optionally strip or encode other special characters.

$value = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS);

full_special_chars

$value = filter_var($string, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

string

Strip tags, optionally strip or encode special characters.

$value = filter_var($string, FILTER_SANITIZE_STRING);

stripped

Alias voor FILTER_SANITIZE_STRING

url

Remove all characters except letters, digits and $-_.+!*'(),{}|\^~[]`<>#%";/?:@&=.

$value = filter_var($string, FILTER_SANITIZE_URL);

unsafe_raw

$value = filter_var($string, FILTER_UNSAFE_RAW);

Deze filter doet niks, tenzij er een extra parameter (Filter Flags) wordt toegevoegd

Superglobals

In plaats van gebruik te maken van superglobals kan je ook de input variabelen opvragen:

  • INPUT_GET
  • INPUT_POST
  • INPUT_COOKIE
  • INPUT_ENV
  • INPUT_SERVER
  • INPUT_SESSION (nog niet geïmplemteerd)
  • INPUT_REQUEST (nog niet geïmplemteerd)
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$name = filter_var(INPUT_POST, 'name', FILTER_SANITIZE_STRING);

Formulier validatie

if ( ! filter_has_var(INPUT_POST, 'submit')) { // TRUE }

Een formulier kan met diverse functies (e.g. isset, empty, is_int, is_float, etc) en reguliere expressies gevalideerd worden.

Met validatie filters beperk je de verschillende manieren van valideren tot een manier van valideren.

Validatie filters zijn makkelijk te groeperen:

$vooraarden = array(
    'email' => FILTER_VALIDATE_EMAIL,
    'url'   => FILTER_VALIDATE_URL,
    'year'  => array(
        'filter' => FILTER_VALIDATE_INT,
        'options'=> array('min_range' => 2010, 'max_range' => 2015)
    )
);

$input = filter_input_array(INPUT_POST, $vooraarden);

if ($input['email'] === false) { // Email is invalid }
if ($input['url'] === false) { // URL is invalid }
if ($input['year'] === false) { // Year is invalid }

Callback

Met de callback functionaliteit is het mogelijk om de filter functies snel te implementeren in een bestaand framework.

Class Validate
{
    public static function valid_country()
    {
        // @todo some validation
        return true;
    }
}

if (filter_var($value, 'countries' => array(
    'filter' => FILTER_CALLBACK,
    'options'  => 'Validate::valid_country'
)) == true) { // Country is valid }