www.manualy.net
logo
Originální stránky pro originální lidi. Výrobky chráněných dílen
Google

Knihovna PHP: Validace vstupních dat

27.1. 2006 Vebloud PHP

Formuláře a jejich zpracování je denním chlebem při tvorbě webových aplikací. Ověření uživatelského, respektive jakéhokoliv vstupu je nutnost a proto jsem si stvořil knihovnu pro ověření různých druhů dat.

Po několika vytvořených aplikacích jsem dal jednotlivá ověření vstupů dohromady a vznikla mi menší knihovna, která mi jednoduchými funkcemi umožní ověřit, zda jsou vložená data celým číslem, desetinným číslem, jsou v daném rozsahu. Jestli je to datum, PSČ, telefonní číslo, e-mail nebo URL. A nebo jestli vyhovuje vloženému RegExpu (Regular Expression - Regulární výraz)

Knihovnu jsem nevytvořil jako třídu se statickými metodami, ale jako soubor s několika funkcemi, protože ne všude je podporováno PHP5 a dělat 2 verze se mi nechtělo.

Pro validace používám Perl Compatible regulární výrazy (PCRE), v případě data i vestavěnou funkci ChecDate(). Nemyslím, že je k tomu nutno něco dodat, snad jenom zdroje některých regulárních výrazů a to kontrola telefonního čísla z článku na intervalu a kontrola e-mailu z regexlibrary.

Snad jenom dodám, že pokud najdete chybu, či budete mít jakoukoliv připomínku na další údaj k validaci, nebo vylepšení, napište to do diskuze pod článekem.

Code:
<?php

//---Match unlimited float or integer in format 0.0; 0; .0
//---Uzna desetinne nebo cele cislo ve formatu 0.0; 0; .0
function isFloat($to_validate)
{
  $RegExp = "/^[-+]?(\d*\.\d+|\.\d+|\d+)$/";
  return (boolean)preg_match($RegExp,$to_validate);
}

//---Same as isFloat, but $to_validate must be between $from and
//--- $to andif $from or $to isn't foat or $from is greater or
//--- equal to $to return zero
//---Funguje stejne jako isFloat, ale $to_validate musi byt 
//---mezi $from a $to a pokud $from nebo $to nejsou desetinna
//--- cisla, nebo je $from vetsi rovno $to vraci 0
function isFloatBetween($to_validate, $from, $to)
{
  if (isFloat($from) && isFloat($to) && $from <= $to)
  {
    return isFloat($to_validate)
                    && ($to_validate < $to)
                    && ($to_validate > $from);
  }
  else
  {
    return 0;
  }
}

//---Match unlimited integer
//---Uzna cele cislo (bez limitu)
function isInt($to_validate)
{
  $RegExp = "/^[-+]?\d+$/";
  return (boolean)preg_match($RegExp,$to_validate);
}

//---Same as isInt, $to_validate must be between $from and $to and
//---if $from or $to isn't integer or $from is >= $to return zero
//---Stejne jako isInt, $to_validate musi byt mezi $from a $to, pokud
//---$from nebo $to nejsou cela cisla, nebo je $from >= $to vraci 0

function isIntBetween($to_validate, $from, $to)
{
  if (isInt($from) && isInt($to) && $from <= $to)
  {
    return isInt($to_validate)
                    && ($to_validate < $to)
                    && ($to_validate > $from);
  }
  else
  {
    return 0;
  }
}

//---Check Czech format of date DD. MM. RRRR don't required zeros 
//---and spacesbetween DD and MM
//---Kontroluje cesky format data tzn. DD. MM. RRRR bez povinych
//---nul a mezer
function isDate($to_validate)
{
  $RegExp = "/^(\d{1,2})\. ?(\d{1,2})\. ?(\d{4})$/";
  return preg_match($RegExp, $to_validate, $match) 
                    && checkdate($match[2], $match[1], $match[3]);
  //return checkdate($match[2], $match[1], $match[3]);
}


//---Check Czech phone number optional interneational preposition 
//---+420 and gaps betweeen trinity of numbers
//---KOntroluje Ceske teefonni cislo, nepovinny mezinarodni predpona
//--- +420 a nepovinne mezery mezi trojicemi cisel
function isCzechPhoneNumber($to_validate)
{
  $RegExp = "/^(\+420)? ?\d{3} ?\d{3} ?\d{3}$/";
  return preg_match($RegExp,$to_validate);
}


//---Check Czech format of Zip Code optional gap between third and
//---fourth number
//---Kontroluje ceske smerovaci cislo, nepovinna mezera mezi treti a
//---ctvrtou cislici
function isZipCode($to_validate)
{
  $RegExp = "/^\d{3} ?\d{2}$/";
  return preg_match($RegExp,$to_validate);
}

//--- http://www.regexlib.com/REDetails.aspx?regexp_id=284
function isEmail($to_validate)
{
  $RegExp ="/^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?";
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?";
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?";  
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?"; 
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|";
  $RegExp.="((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+";
  $RegExp.= "(([\-])+([a-zA-Z0-9])+)*))$/";
  return preg_match($RegExp,$to_validate);
}


//--- http://interval.cz/clanek.asp?article=3776
function isURL($to_validate)
{
  $RegExp ="/^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?";
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?";
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?";
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?";
  $RegExp.="([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|";
  $RegExp.="((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+";
  $RegExp.="(([\-])+([a-zA-Z0-9])+)*))$/";
  return preg_match($RegExp,$to_validate);
}
?>

Napište váš názor na článek.