Knihovna PHP: Validace vstupních dat
27.1. 2006Formulář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); } ?>

