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 } 
David van der Tuijn
"Mijn naam is David van der Tuijn, als senior php developer bij Floro Webdevelopment B.V. werk ik samen met een projectleider, back-end developers, front-end developers en designers, op basis van een functioneel- (FO) en technisch ontwerp (TO), bouw ik webapplicaties die voldoen aan de nieuwste ontwikkelingen op internet gebied. Ik werk zelfstandig, weet hoe een architectuur opgezet moet worden en kan deze uitdragen in een multidisciplinair team. binnen een project adviseer ik over de juiste methoden en technieken. Ik ontwikkel en bewaak de kwaliteit van de development werkzaamheden in projecten en kan projecten binnen een afgegeven planning afronden."