Helpers – Validate – Validaciones de datos
Funciones que siempre devuelven true o false y cuya finalidad es validar una pregunta.
Podemos validar, fecha, horas, emails, textos vacÃos, teléfonos, nif, tipos de dispositivos, preguntar si el texto tiene sólo letras, números y muchas otras valdiaciones de propósito general.
/** * HelperValidate.php * @author Code Develium */ namespace Helpers; /** * Class HelperValidate */ abstract class HelpValidate { /** * Comprueva si un valor esta vacÃo. * Espacios en blanco se consideran vacios. Fechas a cero, se * consideran vacias. * 0, true o false se considera no vacio. * * @param mixed $valor * * @return bool */ public static function isEmpty($valor): bool { if ($valor === false || is_object($valor) || is_null($valor)){ return false; } if (is_array($valor) && count($valor) === 0) { return true; } if (is_array($valor) && count($valor) !== 0) { return false; } $tmp = strtolower(trim(''.$valor)); if ($tmp === '0') { return false; } if ($tmp === '0000-00-00' || $tmp === '0000-00-00 00:00:00' || $tmp === '00:00:00' || $tmp === 'null') { return true; } return ($tmp === ''); } /** * Indica si el correo pasado como parámetro es válida o no * * @param string $sEmail * * @return bool * @version 1.0 */ public static function isEmail($sEmail) { /* filter_var: Si NO es email devuelve false, si es correcto devuelve el mismo email */ return !( filter_var($sEmail, FILTER_VALIDATE_EMAIL) === false); } /** * Comprueba si una fecha i hora en formato "yyyy-mm-dd hh:mm:ss" * es correcta * * @param string $datetime * @param string $sep * * @return bool */ public static function isDateTime($datetime, $sep = '-'): bool { $datetime = ''.$datetime; // yyyy-mm-dd hh:mm:ss if ( 19 != strlen($datetime) || $datetime[ 4 ] != $sep || $datetime[ 7 ] != $sep || $datetime[ 10 ] != ' ' || $datetime[ 13 ] != ':' || $datetime[ 16 ] != ':') { return false; } list($fecha, $hora) = explode(' ', $datetime); list($anio, $mes, $dia) = explode($sep , $fecha); list($hora, $min, $sec) = explode(':', $hora); return ( $datetime == date('Y-m-d H:i:s', mktime($hora, $min, $sec, $mes, $dia, $anio)) ); } /** * Indica si una fecha en formato "yyyy-mm-dd" es válida. * * @param string $fecha * @param string $sep * * @return bool */ public static function isDate($fecha, $sep = '-'): bool { $fecha = ''.$fecha; // yyyy-mm-dd if ( 10 != strlen($fecha) || $fecha[ 4 ] != $sep || $fecha[ 7 ] != $sep) { return false; } list($anio, $mes, $dia) = explode($sep, $fecha); return ($fecha == date('Y-m-d', mktime(0, 0, 0, $mes, $dia, $anio)) ); } /** * Valida si es un string de hora correcta. * * @param $time * * @return bool */ public static function isTime($time) { if (!@preg_match("/^\d{2}:\d{2}:\d{2}$/", $time)) { return false; } $arrTime = explode(":", $time); list($hora, $min, $sec) = $arrTime; settype($hora, "integer"); settype($min, "integer"); settype($sec, "integer"); if ($hora >= 0 && $hora <= 23) { if ($min >= 0 && $min <= 59) { if ($sec >= 0 && $sec <= 59) { $ret = true; } else { $ret = false; } } else { $ret = false; } } else { $ret = false; } return $ret; } /** * Indica si el dispositivo es un dispositivo móvil * @return bool */ public static function isDeviceMobile(): bool { $httpAgent = HelpString::toLower( HelpServer::getValue('HTTP_USER_AGENT') ); $iPod = stripos($httpAgent, "ipod") !== false; $iPhone = stripos($httpAgent, "iphone") !== false; $iPad = stripos($httpAgent, "ipad") !== false; $Android = stripos($httpAgent, "android") !== false; $webOS = stripos($httpAgent, "webos") !== false; $blackberry = stripos($httpAgent, "blackberry") !== false; return ($iPod || $iPhone || $iPad || $Android || $webOS || $blackberry); } /** * Indica si la llamada actual es un método POST * @return bool */ public static function isMethodPost() { return (strtoupper( HelpServer::getValue('REQUEST_METHOD') ) === 'POST' ); } /** * Indica si la llamada actual es un método PUT * @return bool */ public static function isMethodPut() { return (strtoupper( HelpServer::getValue('REQUEST_METHOD') ) === 'PUT'); } /** * Indica si la llamada actual es un método DELETE * @return bool */ public static function isMethodDelete() { return (strtoupper( HelpServer::getValue('REQUEST_METHOD') ) === 'DELETE'); } /** * Indica si la llamada actual es un método GET * @return bool */ public static function isMethodGet() { return (strtoupper( HelpServer::getValue('REQUEST_METHOD') ) === 'GET'); } /** * Indica si el valor es un GUI válido * * @param $guid * * @return bool */ public static function isGUID($guid) { if ( 36 != strlen($guid)) { return false; } return (preg_match("/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/i", $guid)); } /** * Indica si un archivo es un linke * * @param string $nombre_archivo * * @return bool */ public static function isFileLink($nombre_archivo) { return is_link($nombre_archivo); } /** * Indica si un archivo tiene extensión de imagen * Contempla jpeg, png y gif * * @param string $archivo * * @return bool */ public static function isFileImage($archivo) { return (preg_match('/\.(?:jpeg|png|gif|jpg)$/i', $archivo)); } /** * Indica si un archivo es ejecutable * * @param string $nombre_archivo * * @return bool */ public static function isFileExe($nombre_archivo) { return is_executable($nombre_archivo); } /** * Indica si un archivo es un archivo (no es un directrorio) * * @param string $nombre_archivo * * @return bool */ public static function isFile($nombre_archivo) { return is_file($nombre_archivo); } /** * Indica si el archivo es un directorio * * @param $nombre_archivo * * @return bool */ public static function isDir($nombre_archivo) { return is_dir($nombre_archivo); } /** * Indica si la data esta en format UTC * Format: YYYYMMDDTHHiissZ * * @param $datetimeUTC * * @return bool */ public static function isDateTimeUTC($datetimeUTC): bool { /* -- UTC = 20070724T224556Z */ $datetimeUTC = strtoupper($datetimeUTC); $fecha = substr($datetimeUTC, 0, 4) . '-'. substr($datetimeUTC, 4, 2) . '-'. substr($datetimeUTC, 6, 2); $t = substr($datetimeUTC, 8, 1); $hora = substr($datetimeUTC, 9, 2) . ':'. substr($datetimeUTC, 11, 2) . ':'. substr($datetimeUTC, 13, 2); if (!HelpValidate::isDateTime($fecha." ".$hora)) { return false; } return ($t == 'T' && 'Z' == substr($datetimeUTC, 15, 1)); } /** * Indica si un objeto es de una clase determinada. * * @param mixed $obj * @param string $class_name * * @return bool */ public static function isClassOf($obj, $class_name): bool { return strtoupper(get_class($obj)) == strtoupper($class_name); } /** * Devuelve true si una fecha esta entre otras dos * * @param string $fecha * @param string $inicio * @param string $fin * @param bool $cerrado * * @return bool */ public static function isBetweenDates($fecha, $inicio, $fin, $cerrado = true) : bool { if ($cerrado) { if ($inicio === $fecha || $fin === $fecha) { return true; } } return (HelpDate::getDif($inicio, $fecha) < 0 && HelpDate::getDif($fin, $fecha) > 0); } /** * Indica si un valor esta comprendido entre otros dos * * @param int $num * @param int $min * @param int $max * @param bool $cerrado * * @return bool */ public static function isBetween( $num, $min, $max, $cerrado = true) { if ($cerrado) { return ($num >= $min && $num <= $max); } else { return ($num > $min && $num < $max); } } /** * Busca si existe una palabra entera dentro de un texto * Ex: "web" => "PHP is web scripting" => true (es una palabra) * Ex: "web" => "PHP is web, scripting" => true (es una palabra) * Ex: "web" => "PHP is web,scripting" => true (es una palabra) * "web" => "PHP is the website scripting" => false (no es * una palabra) * * @param string $texto * @param string $palabraBuscar * * @return bool */ public static function existWord($texto, $palabraBuscar) { // false => error $ret = preg_match("/\b".$palabraBuscar."\b/i", $texto); if( false === $ret ){ return false; } // 0 si no coincide return 0 !== $ret; } /** * Devuelve true si el texto tiene CR o LF * * @param $text * * @return bool */ public static function existCRLF($text) { // false => error $ret = preg_match("/(%0A|%0D|\\n+|\\r+)/i", $text); if( false === $ret ){ return false; } // 0 si no coincide return 0 !== $ret; } /** * Comprueba si una string termina por un string determinado * Insensible a mayúsculas, minúsculas y acentos * * @param $str * @param $end * * @return bool */ public static function endsWith($str, $end): bool { $len = strlen($end); $lenStr = strlen($str); if( $len > 0 && $lenStr > 0 && ($lenStr - $len) > 0 ) { $str = substr($str, $lenStr - $len); return (0 == strcasecmp( HelpString::eliminarAcentos($str), HelpString::eliminarAcentos($end) )); } return false; } /** * Indica si un string empieza por un determinado string. * Insensible a mayúsculas, minúsculas y acentos * * @param $str * @param $begin * * @return bool */ public static function beginsWith($str, $begin): bool { $len = strlen($begin); if( $len > 0 ){ return (0 == trncasecmp( HelpString::eliminarAcentos($str), HelpString::eliminarAcentos($begin), strlen($begin)) ); } return false; } /** * Devuelve true si todos los caracteres son letras, numero o * decimales (int, float) * Incluye el punto como decimal. * Pueden pasarse como parámetro otros carácteres para considerar * ser válidos * * @param mixed $mixed * @param string $sCharsPermitidos * * @return bool */ public static function areOnlyNumLetters( $mixed, $sCharsPermitidos = '') { return (preg_match( "/^[a-zA-Z0-9.".$sCharsPermitidos."]+$/", ''.$mixed)); } /** * Devuelve true si todos los caracteres números (int) * No acepta el punto decimal * Pueden pasarse como parámetro otros carácteres para considerar * ser válidos * * @param mixed $mixed * @param string $sCharsPermitidos * * @return bool */ public static function areOnlyNum($mixed, $sCharsPermitidos = '') { return (preg_match('/^[0-9'.$sCharsPermitidos.']+$/', ''.$mixed)); } /** * Devuelve true si todos los caracteres son letras * Pueden pasarse como parámetro otros carácteres para considerar * ser válidos * * @param mixed $mixed * @param string $sCharsPermitidos * * @return bool */ public static function areOnlyLetters($mixed, $sCharsPermitidos = '' ) { return (preg_match("/^[a-zA-Z".$sCharsPermitidos."]+$/", ''.$mixed)); } /** * Comprueba si dos valores son iguales, pueden ser string, o * números. * Insensible a mayúsculas, minúsculas y acentos * * @param $mix1 * @param $mix2 * * @return bool */ public static function areEquals($mix1, $mix2) : bool { return (0 == strcasecmp( HelpString::eliminarAcentos($mix1), HelpString::eliminarAcentos($mix2)) ); } /** * Indica si es un código postal válido * * @param string $cp * * @return bool */ public static function isCodigoPostal($cp) { $cp = trim($cp); $ok = (preg_match("/^[0-9]+$/", $cp) && strlen($cp) == 5); $provincia = intval(substr($cp, 0, 2)); return ($provincia >= 1 && $provincia <= 52 && $ok); } /** * Indica si un año es bisiesto * * @param $anio * * @return bool */ public static function isYearLeap($anio) { return (($anio % 4) == 0 && (($anio % 100) != 0 || ($anio % 400) == 0)); } /** * Comprueva la sintaxis de una url es correcta * Puede contener o no el protocolo. * Detecta el protocolo http, https y ftp * * @param $url * @param bool $protocolo * * @return false|int */ public static function isUrl($url, $protocolo = false) { // Carácteres permitidos $chars = '[a-z0-9\/:_\-_\.\?\$,;~=#&%\+]'; if ($protocolo) { return preg_match("/^(http|https|ftp):\/\/".$chars."+$/i", $url); } else { return preg_match("/^".$chars."+$/i", $url); } } /** * Valida si un número de teléfono pertenece a un móvil * * @param string $tel * * @return bool */ public static function isPhoneMovile($tel) { $tel = trim($tel); $ok = (preg_match("/^[0-9]+$/", $tel) && strlen($tel) == 9); $codigo = intval(substr($tel, 0, 1)); return (($codigo == 6 || $codigo == 7) && $ok); } /** * Valida si es un número de telefono fijo * * @param string $tel * * @return bool */ public static function isPhonefFix($tel) { $tel = trim($tel); $ok_1 = (preg_match("/^[0-9]+$/", $tel) && strlen($tel) == 9); $codigo = intval(substr($tel, 0, 2)); switch ($codigo) { case 91: // -- Madrid case 93: // -- Barcelona case 94: // -- Vizcaya case 95: // -- Sevilla case 96: // -- Alicante case 98: // -- Asturias $ok_provincia_2 = true; break; default: $ok_provincia_2 = false; break; } $codigo = intval(substr($tel, 0, 3)); switch ($codigo) { case 923: // -- Salamanca case 973: // -- Lleida case 921: // -- Segovia case 926: // -- Ciudad Real case 975: // -- Soria case 977: // -- Tarragona case 920: // -- Avila case 922: // -- Tenerife case 924: // -- Badajoz case 972: // -- Girona case 978: // -- Teruel case 971: // -- Baleares case 925: // -- Toledo case 979: // -- Palencia case 927: // -- Cáceres case 928: // -- Palmas, Las case 974: // -- Huesca case 976: // -- Zaragoza $ok_provincia_3 = true; break; default: $ok_provincia_3 = false; break; } return (($ok_provincia_2 || $ok_provincia_3) && $ok_1); } /** * Indica si un NIF es válido * * @param $str * * @return bool */ public static function isNif($str): bool { /* normalizamos el formato */ $str = preg_replace('/[^0-9A-Z]/i', '', $str); /* El formato es de un NIF o un NIE */ if (preg_match('/X?[0-9]{8}[A-Z]/i', $str)) { /* para no duplicar código, eliminamos la X en el caso de que sea un NIE */ $str = preg_replace('/^X/i', '', $str); /* calculamos que letra corresponde al número del DNI o NIE */ $stack = 'TRWAGMYFPDXBNJZSQVHLCKE'; $pos = substr($str, 0, 8) % 23; if (strtoupper(substr($str, 8, 1)) == substr($stack, $pos, 1)) { return true; } } /* El formato es el de un CIF */ else { if (preg_match('/[A-HK-NPQS][0-9]{7}[A-J0-9]/i', $str)) /* CIF */ { $sum = 0; /* sumar los digitos en posiciones pares */ for ($i = 2; $i < strlen($str) - 1; $i += 2) { $sum += substr($str, $i, 1); } /* Multiplicar los digitos en posiciones impares por 2 y sumar los digitos del resultado */ for ($i = 1; $i < strlen($str) - 1; $i += 2) { $t = substr($str, $i, 1) * 2; /* agrega la suma de los digitos del resultado de la multiplicación */ $sum += ($t > 9) ? ($t - 9) : $t; } /* Restamos el último digito de la suma actual a 10 para obtener el control */ $control = 10 - ($sum % 10); /* El control puede ser un número o una letra */ if (substr($str, 8, 1) == $control || strtoupper(substr($str, 8, 1)) == substr('JABCDEFGHI', $control, 1)) { return true; } return false; } } return false; } }