Helper Validate.
Funciones para validar datos

Code Helper

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;
    }

}