Type que l'on veut verifier * @value Valeur a verifier * * @return match Retourne si oui ou non la valeur @value est du bon type @type * */ public static function run($type, $value){ $checker = true; /* [0] On verifie que $value n'est pas nul =========================================================*/ if( is_null($value) ) return false; /* [1] Si de type VARCHAR(min, max, flags) =========================================================*/ if( preg_match('/^varchar\((\d+), ?(\d+)((?:, ?\w+)+)?\)$/', $type, $match) ){ // On recupere la taille min $min = (int) $match[1]; // On recupere la taille max $max = (int) $match[2]; // On recupere le sous-type si défini $flags = isset($match[3]) ? explode(',', substr($match[3], 1)) : null; // On effectue la verification de taille $lenCheck = $checker && is_string($value) && strlen($value) <= $max && strlen($value) >= $min; // On vérifie les FLAGS s'il est donné if( is_array($flags) ) foreach( $flags as $flag ) $lenCheck = $lenCheck && self::run($flag, $value); return $lenCheck; } /* [2] Si de type ARRAY(type_elements) =========================================================*/ if( preg_match('/^array<(.+)>$/', $type, $match) ){ // Si c'est pas un tableau on retourne une erreur if( !is_array($value) ) return false; $elements_type = $match[1]; // On verifie le type pour chaque element foreach($value as $element) // Si erreur dans au moins 1 element, on retourne que c'est incorrect if( !self::run($elements_type, ($element) ) ) return false; // Si aucune erreur, on retourne que tout est bon return true; } /* [n] Sinon, tous les autres types definis =========================================================*/ switch($type){ // Quoi que ce soit case 'mixed': return $checker && !is_null($value); break; // Entier positif (id dans BDD) case 'id': return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0; break; // Code RFID case 'rfid': return $checker && is_string($value) && preg_match('/^[\dA-F]{2}(\-[\dA-F]{2}){3,5}$/i', $value); break; // String quelconque (peut etre vide) case 'text': return $checker && is_string($value); // Adresse mail (255 caracteres max) case 'mail': return $checker && is_string($value) && strlen($value) <= 50 && preg_match('/^[\w\.-]+@[\w\.-]+\.[a-z]{2,4}$/i', $value); break; // Hash sha1/md5 case 'hash': return $checker && is_string($value) && preg_match('/^[\da-f]+$/i', $value) && (strlen($value) == 40 || strlen($value) == 64); break; case 'alphanumeric': return $checker && is_string($value) && preg_match('/^[\w\.-]+$/ui', $value); break; case 'letters': return $checker && is_string($value) && preg_match('/^[a-z -]+$/i', $value); break; case 'status': return $checker && is_numeric($value) && floor($value) == $value && $value >= 0 && $value <= 100; break; // Tableau non vide case 'array': return $checker && is_array($value) && count($value) > 0; break; // Boolean case 'boolean': return $checker && is_bool($value); break; // Objet non vide case 'object': return $checker && is_object($value) && count((array) $value) > 0; break; // Chaine JSON (on vérifie via le parser) case 'json': return $checker && is_string($value) && json_decode($value, true) !== NULL; break; default: return false; break; } return $checker; } } ?>