Helper String.
Funciones para manipular de cadenas de texto

Code Helper

Helpers – String – Manipulaciones de textos

Las páginas están llenos de texto, y muchas veces se tiene que tratar, ya sea convertíendolos, retocando, reemplazando o eliminado parte de su contenido.

Con esta librería podremos realizar todas estas acciones sobre los texto, de las páginas, de los inputs para poder garantizar el texto deseado.

/**
 * HelperString.php
 * @author      Code Develium
 */

namespace Helpers;

/**
 * Class HelperString
 */
abstract class HelpString
{
    /**
     * Convierte un string a mayúsculas.
     * Es insensible a lo acéntos.
     *
     * @param string $txt
     *
     * @return string
     */
    public static function toUpper($txt): string
    {
        if (function_exists('mb_strtoupper')) {
            // Convierte carcateres especiales
            return ''.mb_strtoupper($txt); 
        }
        return ''.strtoupper($txt);
    }

    /**
     * Convierte un string a minúsculas.
     * Es insensible a lo acéntos.
     *
     * @param string $txt
     *
     * @return string
     */
    public static function toLower($txt): string
    {
        if (function_exists('mb_strtolower')) {
            // Convierte carcateres especiales
            return ''.mb_strtolower($txt); 
        }
        return ''.strtolower($txt);
    }

    /**
     * Reemplaza sólo la primera ocurrencia de un string por otro.
     * Es insensible a mayúsculas i minúsculas pero no a los acentos.
     * Si no existe la ocurrencia, devuelve el mismo string
     *
     * @param string $txt
     * @param string $origen
     * @param string $destino
     *
     * @return string
     */

    public static function replaceFirst($txt, $origen, $destino)
    {
        $origen = '/'.preg_quote(''.$origen, '/').'/i';

        return ''.preg_replace($origen, ''.$destino, ''.$txt, 1);
    }

    /**
     * Reemplaza todas las ocurrencias.
     * Es insensible a mayúsculas y minúsculas pero no a loa acentos
     * Devuelve el numero de ocurrencias sustiruidas
     *
     * @param string   $texto
     * @param string   $origen
     * @param string   $destino
     * @param int|null $numSuccess
     *
     * @return string
     */
    public static function replaceAll( $texto, 
                                       $origen, 
                                       $destino, 
                                       &$numSuccess = null): string
    {
        return str_ireplace( ''. $origen, 
                             ''. $destino, 
                             ''. $texto, 
                             $numSuccess);
    }

    /**
     * Devuelve la posición de la primera ocurrencia en un texto.
     * Es indiferente a mayúsculas, minúsculas y acentos
     * Se puede delimitar donde empezar a buscar.
     * Devuelve -1 si no existe, siendo 0 la primera posición
     *
     * @param     $txt
     * @param     $ocurencia
     * @param int $posInicioBuscar
     *
     * @return int
     */
    public static function indexOf( $txt, 
                                    $ocurencia, 
                                    $posInicioBuscar = 0): int
    {
        $txt       = self::eliminarAcentos($txt);
        $ocurencia = self::eliminarAcentos($ocurencia);
        $pos       = stripos($txt, $ocurencia, $posInicioBuscar);
        if ($pos === false) {
            return -1;
        }
        return $pos;
    }

    /**
     * Devuelve la posición de la última ocurrencia en un texto.
     * Es indiferente a mayúsculas y minúsculas pero no a los acentos
     * Se puede delimitar hasta donde buscar.
     * Devuelve -1 si no existe, siendo 0 la primera posición
     *
     * @param string $txt
     * @param string $ocurencia
     * @param int    $posFinalBuscar
     *
     * @return int
     */
    public static function indexOfLast( $txt, 
                                        $ocurencia, 
                                        $posFinalBuscar = 0): int
    {
        $pos = strripos($txt, $ocurencia, -1 * $posFinalBuscar);
        if ($pos === false) {
            return -1;
        }
        return $pos;
    }

    /**
     * Elimina los tabuladores, y salos de línea
     *
     * @param string $str
     *
     * @return string
     */
    public static function sanitizeTabReturn($str): string
    {
        return preg_replace('/[\n\r\t]+/', '', $str);
    }

    /**
     * Elimina los espacios en blanco inncesarios
     *
     * @param string $str
     *
     * @return string
     */
    public static function sanitizeBlancks($str): string
    {
        return trim(preg_replace('/\s{2,}/', ' ', $str));
    }

    /**
     * Elimina todas las letras con acentos, elimina caracteres no 
     * alfanumericos
     * puntos o subrayados, cambia el espacio en blanco por un guión 
     * bajo
     *
     * @param string $texto
     *
     * @return string
     */
    public static function sanitizeAll($texto): string
    {
        /* Elimina accentos, ñ y ç */
        $texto = strtolower(strtr($texto,
                  'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÇÑáéíóúàèìòùäëïöüâêîôûçñ ',
                  'aeiouaeiouaeiouaeioucnaeiouaeiouaeiouaeioucn_'));

        /* Elimina cualquier carácter no alfanumerico, punto o guión
            bajo */
        return preg_replace( '/[^[:alnum:]._]/ui', 
                             '', 
                             strtoupper(trim($texto)));
    }

    /**
     * Devuelve la parte de la derecha despues de un texto delimitador
     * que se busca desde la izquierda.
     * No devuelve el delimitador
     *
     * @param $texto
     * @param $delimitador
     *
     * @return string
     */
    public static function getRightStringBack($texto, $delimitador)
    {
        $pos = stripos($texto, $delimitador);
        $ret = '';
        if (false !== $pos) {
            /* Busca el delimitador partiendo de la izquierda
             y si lo encuentra devuelve la parde de la la derecha */
            $ret = substr($texto, ($pos + strlen($delimitador)));
            if ($ret === false) {
                return '';
            }
        }
        return $ret;
    }

    /**
     * Devuevle la parte de la derecha después de un delimitador
     * Busca el delimitador empezando desde la derecha
     *
     * @param $txt
     * @param $delimitador
     *
     * @return string
     */
    public static function getRightString($txt, $delimitador): string
    {
        $ret = '';
        $pos = stripos($txt, $delimitador);
        if ($pos !== false) {
            $ret = substr( $txt, 
                           $pos + strlen($delimitador), 
                           strlen($txt));
            if ($ret === false) {
                return '';
            }

        }
        return $ret;
    }

    /**
     * Devuelve los N caractarede de la derecha.
     * Empieza a contar desde la derecha
     *
     * @param $str
     * @param $len
     *
     * @return string
     */
    public static function getRightNum($str, $len): string
    {
        $len_str = strlen($str);
        if ($len > $len_str) {
            $ret = $str;
        } else {
            $ret = substr($str, $len_str - $len);
            if (false === $ret) {
                return '';
            }
        }
        return $ret;
    }

    /**
     * Devuelve los N caracteres después de un delimitador
     *
     * @param $txt
     * @param $delimitador
     * @param $len
     *
     * @return string
     */
    public static function getMiddleString( $txt, 
                                            $delimitador, 
                                            $len): string
    {
        $ret = '';
        if (stripos($txt, $delimitador) !== false) {
            $pi  = stripos($txt, $delimitador) + strlen($delimitador);
            $ret = substr($txt, $pi, $len);
            if ($ret === false) {
                return '';
            }
        }
        return $ret;
    }

    /**
     * Devuelve los N caracteres después de una posición determinada 
     * empezando por la izquierda
     *
     * @param $txt
     * @param $posIni
     * @param $len
     *
     * @return string
     */
    public static function getMiddleNum($txt, $posIni, $len): string
    {
        $ret = substr($txt, $posIni, $len);
        if ($ret === false) {
            return '';
        }
        return $ret;
    }

    /**
     * Devuelve la parte de la izquierda hasta un texto delimitador
     *
     * @param $texto
     * @param $delimitador
     *
     * @return string
     */
    public static function getLeftString($texto, $delimitador): string
    {
        $pos = stripos($texto, $delimitador);
        $ret = '';
        if (false !== $pos) {
            $ret = substr($texto, 0, $pos);
            if ($ret === false) {
                return '';
            }
        }
        return $ret;
    }

    /**
     * Empezando a contar desde la izquierda, devuelve la parte de la
     * derecha
     * despres de una longitud determinada
     *
     * @param $texto
     * @param $len
     *
     * @return string
     */
    public static function getRightNumBack($texto, $len): string
    {
        /* Empezando por la izquierda, devuelve la parte derecha */
        $ret = substr($texto, $len);
        if (false === $ret) {
            return '';
        }
        return $ret;
    }

    /**
     * Devuelve el texto de la izquierda de una determinada longitud.
     * Empieza a contar por la izquierda.
     * Si no se puede obtener, devuelve un string vacío
     *
     * @param $texto
     * @param $len
     *
     * @return string
     */
    public static function getLeftNum($texto, $len): string
    {
        /* Empezando por la izquierda, devuelve la perte de la 
           izquierda */
        $ret = substr(''.$texto, 0, $len);

        if (false === $ret) {
            return '';
        }
        return $ret;
    }

    /**
     * Devuelve el último carácter de un string
     *
     * @param string $txt
     *
     * @return false|string
     */
    public static function getLastChar($txt): string
    {
        if (HelpValidate::isEmpty($txt)) {
            return '';
        }
        return ''.substr(''.$txt, -1);
    }

    /**
     * Devuelve el texto delimitado entre otros dos textos.
     * Es case insensitive.
     * Devuelve null si lo encuentra.
     * '' => No hay caracteres entre los delimitadores
     *
     * @param $txt
     * @param $strIni
     * @param $strFin
     *
     * @return string
     */
    public static function getBetween($txt, $strIni, $strFin): string
    {
        $ret = null;

        if (stripos($txt, $strIni) !== false) {

            $pi  = stripos($txt, $strIni) + strlen($strIni);
            $lon = stripos($txt, $strFin) - $pi;
            $ret = substr($txt, $pi, $lon);

            if (false === $ret) {
                return '';
            }
        }
        return $ret;
    }

    /**
     * Rellena un texto por la derecha hasta un número determinado 
     * mediante un caraácter
     *
     * @param $txt
     * @param $size
     * @param $charPad
     *
     * @return string
     */
    public static function fillRight($txt, $size, $charPad = '')
    {
        return str_pad($txt, $size, $charPad, STR_PAD_RIGHT);
    }

    /**
     * Rellena un texto por la izquierda hasta un número determinado 
     * mediante un caraácter
     *
     * @param $txt
     * @param $size
     * @param $charPad
     *
     * @return string
     * @since 20/09/2020
     */
    public static function fillLeft($txt, $size, $charPad = '')
    {
        return str_pad($txt, $size, $charPad, STR_PAD_LEFT);
    }

    /**
     * Elimian los acentos de un texto
     *
     * @param $cadena
     *
     * @return string
     */
    public static function eliminarAcentos($cadena): string
    {
        return strtr(trim(''.$cadena), array(
            'á' => 'a',
            'é' => 'e',
            'í' => 'i',
            'ó' => 'o',
            'ú' => 'u',
            'à' => 'a',
            'è' => 'e',
            'ì' => 'i',
            'ò' => 'o',
            'ù' => 'u',
            'Á' => 'A',
            'É' => 'E',
            'Í' => 'I',
            'Ó' => 'O',
            'Ú' => 'U',
            'À' => 'A',
            'È' => 'E',
            'Ì' => 'I',
            'Ò' => 'O',
            'Ù' => 'U',
            'ä' => 'a',
            'ë' => 'e',
            'ï' => 'i',
            'ö' => 'o',
            'ü' => 'u',
            'Ä' => 'A',
            'Ë' => 'E',
            'Ï' => 'I',
            'Ö' => 'O',
            'Ü' => 'U',
            'â' => 'a',
            'ê' => 'e',
            'î' => 'i',
            'ô' => 'o',
            'û' => 'u',
            'Â' => 'A',
            'Ê' => 'E',
            'Î' => 'I',
            'Ô' => 'O',
            'Û' => 'U'
        ));
    }

    /**
     * Devuelve un numero aleatorio entre un mínimo y un máximo.
     *
     * @param $min
     * @param $max
     *
     * @return int
     */
    public static function createRandomRange($min, $max): string
    {
        return ''.mt_rand($min, $max);
    }

    /**
     * Genera un número aleatorio de N digitos de longitud.
     *
     * @param int $numDigitos
     *
     * @return string
     */
    public static function createRandom($numDigitos = 6): string
    {
        $random = '';
        for ($n = $numDigitos; $n > 0; $n--) {
            $generado = ''.mt_rand();
            $posicion = mt_rand(1, strlen($generado) - 1);
            $random   .= $generado[ $posicion ];
        }
        return strval($random);
    }

    /**
     * Genera una clave aleatoria de 10 carcarteres.
     * Letras y números.
     * @return string
     */
    public static function createKey(): string
    {
        return ''.substr(md5(uniqid()), 0, 10);
    }

    /**
     * Devuevle un GUID válido.
     * @return string
     */
    public static function createGUID(): string
    {
        $microTime = microtime();

        list($arrDec, $arrSec) = explode(" ", $microTime);

        $decHex = dechex($arrDec * 1000000);
        $secHex = dechex($arrSec);

        self::guidSetLen($decHex, 5);
        self::guidSetLen($secHex, 6);

        $guid = '';
        $guid .= $decHex;
        $guid .= self::guidCrearSeccion(3);
        $guid .= '-';
        $guid .= self::guidCrearSeccion(4);
        $guid .= '-';
        $guid .= self::guidCrearSeccion(4);
        $guid .= '-';
        $guid .= self::guidCrearSeccion(4);
        $guid .= '-';
        $guid .= $secHex;
        $guid .= self::guidCrearSeccion(6);

        return $guid;
    }

    /**
     * Asignar longitud
     *
     * @param $string
     * @param $length
     */
    private static function guidSetLen(&$string, $length)
    {
        $strlen = strlen($string);
        if ($strlen < $length) {
            $string = str_pad($string, $length, '0');
        } else {
            if ($strlen > $length) {
                $string = substr($string, 0, $length);
            }
        }
    }

    /**
     * Crear sección
     *
     * @param $len
     *
     * @return string
     */
    private static function guidCrearSeccion($len)
    {
        $ret = "";
        for ($i = 0; $i < $len; $i++) {
            $ret .= dechex(mt_rand(0, 15));
        }
        return $ret;
    }

    /**
     * Separa un texto en un número de caracteres por líniea
     * Por defecto inserta al final de cada linea \n.
     * Ex: "The quick brown fox jumped over the lazy dog."
     *            The quick brown fox<br />
     *             jumped over the lazy<br />
     *             dog.
     *
     * @param string $texto
     * @param int    $len
     * @param string $break
     *
     * @return string
     */

    public static function wordWrap($texto, $len, $break = ''): string
    {
        if (empty($break)) {
            return wordwrap($texto, $len);
        } else {
            return wordwrap($texto, $len, $break);
        }
    }

    /**
     * Trunca un string a un número determinado de caracteres.
     * No recorta añade un string al final.
     *
     * @param        $txt
     * @param        $len
     * @param string $fill
     *
     * @return string
     */
    public static function truncate($txt, $len, $fill = '...'): string
    {
        if (HelpValidate::isEmpty($txt)) {
            return '';
        }
        if (strlen($txt) > $len) {
            return ''.substr($txt, 0, $len).$fill;
        }
        return $txt;
    }

    /**
     * Elimina los tags html de un texto.
     * Se puede indicar que tags no ha de eliminar
     *
     * @param string      $txt
     * @param string|null $tagsNoEliminar
     *
     * @return string
     */
    public static function removeHtmlTags( $txt, 
                                           $tagsNoEliminar = null)
    {
        return strip_tags($txt, $tagsNoEliminar);
    }

}