Herramientas

Reemplazar la ñ, acentos, espacios y caracteres especiales con PHP [Actualizada]

<?php
/**
 * Reemplaza todos los acentos por sus equivalentes sin ellos
 *
 * @param $string
 *  string la cadena a sanear
 *
 * @return $string
 *  string saneada
 */
function sanear_string($string)
{
    $string = trim($string);
    $string = str_replace(
        array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
        array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
        $string
    );
    $string = str_replace(
        array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
        array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
        $string
    );
    $string = str_replace(
        array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
        array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
        $string
    );
    $string = str_replace(
        array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
        array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
        $string
    );
    $string = str_replace(
        array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
        array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
        $string
    );
    $string = str_replace(
        array('ñ', 'Ñ', 'ç', 'Ç'),
        array('n', 'N', 'c', 'C',),
        $string
    );
    //Esta parte se encarga de eliminar cualquier caracter extraño
    $string = str_replace(
        array("\\", "¨", "º", "-", "~",
             "#", "@", "|", "!", "\"",
             "·", "$", "%", "&", "/",
             "(", ")", "?", "'", "¡",
             "¿", "[", "^", "`", "]",
             "+", "}", "{", "¨", "´",
             ">", "< ", ";", ",", ":",
             ".", " "),
        '',
        $string
    );
    return $string;
}

Ejemplo de uso:

<?php
echo sanear_string("áàäâªÁÀÂÄdoéèëêÉÈÊËreíìïîÍÌÏÎmióòöôÓÒÖÔfaúùüûÚÙÛÜsolñÑçÇlasi\\¨º-~#@|!\,·$%&/()?¡¿[^`]+}{¨´>< ;,:. ");

Lo anterior imprime:

"aaaaaAAAAdoeeeeEEEEreiiiiIIIImiooooOOOOfauuuuUUUUsolnNcClasi"

Comentarios

  1. Pingback: Reemplazar la ñ, acentos y espacios en PHP | Capy.net

  2. RAM

    Si en la cadena tengo unas comillas doble como lo resuelvo por ejemplo: freno ahogo 3″ 1/2 para que quede algo mas o menos asi: freno-ahogo-3-1_2.

    Gracias

    Responder
  3. Capy Autor

    Bueno la función ya quita la comilla doble en el ultimo trozo, y podes modificar la linea 61 de esta para que en lugar de reemplazar las comillas por ” (por nada) lo haga por un guion bajo ‘_’.

    Ya si lo que queres es algo como el ejemplo que me pusiste solo tenes que borrar de la linea 52 a la 63 y en su lugar poner este código:

    <?php
    $string = str_replace( array("\" "),'-',$string);
    $string = str_replace( array(" ", "\""),'-',$string);
    $string = str_replace( array("/"),'_',$string);
    
    Responder
  4. Gustavo

    Hola, bueno, yo tengo un problema con la codificacion por algo en el servidor, si no funciona, podes hacer
    sanear_string(utf8_encode($string))

    Responder
    1. henry

      Muchas gracias por este pequeño pero muy muy muy significativo aporte, me ayudó mucho utf_encode.
      Y claro el aporte sanear_string es super bueno, gracias.

      Responder
  5. Pineda

    Yo he resuleto el problema de otra manera. A ver qué os parece:

    ‘_’,
    ‘/"|&|<|>| |¡|¢|£|¤/’ => ‘_’,
    ‘/¥|¦|§|¨|©|«|¬|­|®|¯/’ => ‘_’,
    ‘/±|²|³|´|µ|¶|·|÷/’ => ‘_’,
    ‘/°|¹|»|¼|½|¾|¿/’ => ‘_’,

    // Sustituir vocales con signo por las vocales ordinarias.//
    ‘/à|á|â|ã|ä|å|æ|ª/’ => ‘a’,
    ‘/À|Á|Â|Ã|Ä|Å|Æ/’ => ‘A’,
    ‘/è|é|ê|ë|ð/’ => ‘e’,
    ‘/È|É|Ê|Ë|Ð/’ => ‘E’,
    ‘/ì|í|î|ï/’ => ‘i’,
    ‘/Ì|Í|Î|Ï/’ => ‘I’,
    ‘/ò|ó|ô|õ|ö|ø|º/’ => ‘o’,
    ‘/Ò|Ó|Ô|Õ|Ö|Ø/’ => ‘o’,
    ‘/ù|ú|û|ü/’ => ‘u’,
    ‘/Ù|Ú|Û|Ü/’ => ‘U’,

    // Algunas consonantes especiales como la ç, la y, la ñ y otras.//
    ‘/ç/’ => ‘c’,
    ‘/Ç/’ => ‘C’,
    ‘/ý|ÿ/’ => ‘y’,
    ‘/Ý|Ÿ/’ => ‘Y’,
    ‘/ñ/’ => ‘n’,
    ‘/Ñ/’ => ‘N’,
    ‘/þ/’ => ‘t’,
    ‘/Þ/’ => ‘T’,
    ‘/ß/’ => ‘s’,

    );

    $cadena = preg_replace(array_keys($patron),array_values($patron),$cadena);

    ?>

    Responder
  6. diego

    Muchísimas gracias por la idea, me has hecho un rey. Llevo peleándome con los malditos carácteres extraños que extraigo de la base de datos de un cliente, como dos días. Con esto tengo lo que necesito, busco los carácteres en utf8 para hacer el cambio y que así se vea en los lectores rss como debería. Gracias de verdad.

    Responder
  7. Ignacio

    Hola queria pedirles aver si alguien me puede ayudar a incorporarlo a mi codigo:

    Crear Nueva Frase ▼

    var msg = ‘Escribe tu frase aqui…'; var temp =”Creando frase…

    Pega tus simbolos: ♡ | ♥ | ★ | ♀ | ♂ | ♠ | ♤ | ♣ | ♧ | © | ± | ☺ | ☻ | ☼ | ☎ | ♨ | ☞ | ♩ | ♪ | ♫

    Responder
  8. stratovare

    Buenas a todos, si en lugar de pasar una cadena del tipo:

    <?php
    $cadena=sanear_string("áàäâªÁÀÂÄdoéèëêÉÈÊËreíìïîÍÌÏÎmióòöôÓÒÖÔfaúùüûÚÙÛÜsolñÑçÇlasi\\¨º-~#@|!\,·$%&/()?¡¿[^`]+}{¨´><;,:. ");
    

    lo quiero hacer de la siguiente manera:

    <?php
    $cadena = "áàäâªÁÀÂÄdoéèëêÉÈÊËreíìïîÍÌÏÎmióòöôÓÒÖÔfaúùüûÚÙÛÜsolñÑçÇlasi\\¨º-~#@|!\,·$%&/()?¡¿[^`]+}{¨´><;,:. ";
    $cadena=sanear_string($cadena);
    echo $cadena;
    

    ¿Por qué no me funciona? gracias de antemano… un post muy útil

    Responder
    1. Capy Autor

      Hola. acabo de probarlo de las dos formas y me funciona….

      No creo que sea PHP pero solo por las dudas te comento que lo acabo de probar con la versión 5.3.8.

      Saludos.

      Responder
  9. SErgio

    Hola, a mi me pasa lo mismo que a stratovare, yo uso la version 5.3.9 de PHP, le estoy dando vueltas y no consigo que me funcione

    Responder
  10. Capy Autor

    Macho no se que decirte, lo acabo de probar en PHP 5.3.10 ubuntu 64 12.04 y va bien… seguramente hay algo que se me está pasando, no se.

    Por cierto es una instalación nueva casi como viene por defecto.

    Responder
  11. AsderPunk

    Esto no me funciono pues al poner en el campo nombre “\\ ” no me dice nada y me manda guardar la diagonal invertida..??

    Alguna sugerencia?

    Aquí el código:

    <?php
    $num = array('1','2','3','4','5','6','7','8','9','0','','"',"'",'/','select','insert','delete',',',';','.',':','_','{','}','[',']','´','^','`','~','!','|','°','¬','#','$','%','&','(',')','=','?','¡','*','+');
    						// Evitamos los números en Nombres y Apellidos \\
    						for($i=0;$i&lt;=9;$i++) {
    							$nom = strpos($nombre,$num[$i]);
    							if($nom)
    							{
    								echo &#039;	';
    								echo "		Aviso.!El nombre no debe contener números.";
    								echo '	';
    								echo '	 ';
    								$bloq = 1;
    								break;
    							}
    							else
    							{
    								$minombre = $nombre;
    							}
    
    Responder
  12. Henry

    Genial Hermano con esa del $fila[1]=limpiar_caracteres_especiales(utf8_encode($fila[1])); justo asi si me funciono.

    Responder
  13. Lucas

    Hola que tal! genial el articulo. Te quería preguntar, aunque no se si es muy tarde para eso, quiero poder colocar el guión medio “-” o hyphen en la url, sabes de algún manual, o expresión regular que lo permita?? Gracias artista! un saludo!

    Responder
  14. Arturo Vallone

    Yo lo resolví de esta forma:

    <?php
    function replace_specials_characters($s) {
    		$s = mb_convert_encoding($s, 'UTF-8','');
    		$s = preg_replace("/á|à|â|ã|ª/","a",$s);
    		$s = preg_replace("/Á|À|Â|Ã/","A",$s);
    		$s = preg_replace("/é|è|ê/","e",$s);
    		$s = preg_replace("/É|È|Ê/","E",$s);
    		$s = preg_replace("/í|ì|î/","i",$s);
    		$s = preg_replace("/Í|Ì|Î/","I",$s);
    		$s = preg_replace("/ó|ò|ô|õ|º/","o",$s);
    		$s = preg_replace("/Ó|Ò|Ô|Õ/","O",$s);
    		$s = preg_replace("/ú|ù|û/","u",$s);
    		$s = preg_replace("/Ú|Ù|Û/","U",$s);
    		$s = str_replace(" ","_",$s);
    		$s = str_replace("ñ","n",$s);
    		$s = str_replace("Ñ","N",$s);
    		$s = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $s);
    		return $s;
    	}
    

    Es muy parecida a la primer versión que se presentó de la función, solo que en vez de ereg_replace (ya deprecated) utilizo preg_replace adaptando las expresiones regulares, sólo quería hacer notar algo con lo que siempre tuve problemas, todo código fuente PHP se guarda en un archivo de texto, ese archivo de texto tiene una codificación de caracteres específica que definimos nosotros o el editor que estemos utilizando al momento de crear el archivo, lo que hay que tener en cuenta es que todos los literales de strings que definamos en este archivo de código fuente serán codificados en el charset del archivo, es decir que si el archivo tiene charset UTF-8 y dentro del mismo definimos la sentencia:
    $s = preg_replace(“/É|È|Ê/”,”E”,$s);
    El literal “/É|È|Ê/” que utilizamos como patrón estará codificado en UTF-8, con lo cual si en tiempo de ejecución $s asume el valor “É” pero en una codificación distinta, ej.: Latin-1 (ISO-8859-1), la sentencia antes mencionada no tendrá los resultados esperados.
    Hoy en día la mayoría de los editores de textos utiliza UTF-8 debido a su amplia gama de caracteres especiales, debido a eso y muchas veces sin saberlo, nuestro código fuente presenta literales de strings en esa codificación, pero la mayoría de las bases de datos ej.: MySQL, utilizan latin-1 como charset por defecto, por eso es que muchas veces necesitamos convertir nuestra cadena a UTF-8 antes de aplicar las funciones de reemplazo que definimos.
    Bueno, perdón por haberme extendido tanto, pero es un tema que puede traer dolores de cabeza… lo sé muy bien ;)
    Saludos!!

    Responder
    1. Mercedes

      y que tal así?
      function creaUrlLink($s) {
      $s=strtolower($s);
      $s = preg_replace(“/á|à|â|ã|ª/”,”a”,$s);
      $s = preg_replace(“/Á|À|Â|Ã/”,”A”,$s);
      $s = preg_replace(“/é|è|ê/”,”e”,$s);
      $s = preg_replace(“/É|È|Ê/”,”E”,$s);
      $s = preg_replace(“/í|ì|î/”,”i”,$s);
      $s = preg_replace(“/Í|Ì|Î/”,”I”,$s);
      $s = preg_replace(“/ó|ò|ô|õ|º/”,”o”,$s);
      $s = preg_replace(“/Ó|Ò|Ô|Õ/”,”O”,$s);
      $s = preg_replace(“/ú|ù|û/”,”u”,$s);
      $s = preg_replace(“/Ú|Ù|Û/”,”U”,$s);

      $s = str_replace(“ñ”,”n”,$s);
      $s = str_replace(“Ñ”,”N”,$s);

      $s = str_replace(“‘”, ”, $s);
      $s = str_replace(‘%20′, ‘ ‘, $s);//$s = str_replace(” “,”_”,$s);
      $s = preg_replace(‘~[^\\pL0-9_]+~u’, ‘-‘, $s);
      $s = trim($s, “-“);
      $s = iconv(“utf-8″, “us-ascii//TRANSLIT”, $s);
      $s = preg_replace(‘~[^-a-z0-9_]+~’, ”, $s);
      return $s;
      }

      Responder
  15. Rodolfo

    Genial!!! Buen trabajo nos has ahorrado. Esto se llama APORTACION! A destacar la facilidad con la que se puede personalizar para circunstancias específicas de cada cual. Yo no he tenido problema en solucionar el problema que me suponia que se “cargara” los espacios en blanco, que no me interesaba que se sanearan. En un par de clicks, arreglado. Todos sabemos que eso es importante en un código…facilidad para mantenerlo y/o retocarlo. Creo que te debemos Úña Cäña b´¨ieñ Fr-èsqüíta. Anda! Sanea eso!!! :=) Mil gracias, otra vez!!

    Responder
  16. Bryan Horna

    Hola @Capy. Una pregunta: ¿cómo podría implementar esto en una clase, con el respectivo manejo de archivos? Tengo, hasta ahora, el código siguiente:

    <?php
    class Archivos {
        private static function limpiar($cadena) {
            $cadena = trim($cadena);
            $cadena = str_replace(
                array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
                array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
                $cadena
            );
            $cadena = str_replace(
                array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
                array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
                $cadena
            );
            $cadena = str_replace(
                array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
                array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
                $cadena
            );
            $cadena = str_replace(
                array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
                array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
                $cadena
            );
            $cadena = str_replace(
                array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
                array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
                $cadena
            );
            $cadena = str_replace(
                array('ñ', 'Ñ', 'ç', 'Ç'),
                array('n', 'N', 'c', 'C'),
                $cadena
            );
            $cadena = str_replace(' ', '_', $cadena);
            $cadena = str_replace('&', 'y', $cadena);
            $cadena = str_replace(
                array("\\", "¨", "º", "~", "#", "@", "|", "!", "\"", "·", "$", "%", "/", "(", ")", "?", "'", "¡", "¿", "[", "^", "`", "]", "+", "}", "{", "¨", "´", ">", "< ", ";", ":"),
                '',
                $cadena
            );
            return $cadena;
        }
        public static function notificar($primero = '', $segundo = '') {
            if ($primero == '' || $segundo == '') {
                echo 'Hubo un error en el procesamiento de la notificación.';
                return;
            } elseif ($primero != $segundo) {
                echo 'El archivo <strong>' . $primero . ' fue renombrado a <strong>' . $segundo . '</strong>.<br />';
                return;
            } else {
                echo 'El archivo <strong>' . $primero . '</strong> no fue renombrado.<br />';
                return;
            }
        }
        public static function renombrar($directorio = './') {
            self::$directorio = $directorio;
            if ($gestor = opendir($directorio)) {
                while (FALSE !== ($archivo = readdir($gestor))) {
                    if ($archivo != '.' && $archivo != '..') {
                        $antiguo = $directorio . $archivo;
                        $nuevo = $directorio . self::limpiar($archivo);
                        rename($antiguo, $nuevo);
                        self::notificar($antiguo, $nuevo);
                    }
                }
                closedir($gestor);
            }
        }
    }
    ?>
    

    Entonces, ¿cómo haría para cambiar los caracteres. Es decir, sí reemplaza los espacios por “_”, pero los caracteres especiales no los reemplaza. Cómo podría hacer?
    Gracias por anticipado por la respuesta.

    Responder
    1. Capy Autor

      Hola Bryan, acá te dejo una versión funcionando. modifique un par de cositas y la he probado. Renombra bien.
      Una nota importante, asegurate que el directorio en el que vas a renombrar tiene permisos de escritura, sino no va a poder hacerlo.

      <?php
      class Archivos {
        private static function limpiar($string) {
          $string = trim($string);
          $string = str_replace(
            array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
            array('a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A'),
            $string
          );
          $string = str_replace(
            array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
            array('e', 'e', 'e', 'e', 'E', 'E', 'E', 'E'),
            $string
          );
          $string = str_replace(
            array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
            array('i', 'i', 'i', 'i', 'I', 'I', 'I', 'I'),
            $string
          );
          $string = str_replace(
            array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
            array('o', 'o', 'o', 'o', 'O', 'O', 'O', 'O'),
            $string
          );
          $string = str_replace(
            array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
            array('u', 'u', 'u', 'u', 'U', 'U', 'U', 'U'),
            $string
          );
          $string = str_replace(
            array('ñ', 'Ñ', 'ç', 'Ç'),
            array('n', 'N', 'c', 'C',),
            $string
          );
          //Esta parte se encarga de eliminar cualquier caracter extraño
          $string = str_replace(
            array("\\", "¨", "º", "-", "~",
              "#", "@", "|", "!", "\"",
              "·", "$", "%", "&", "/",
              "(", ")", "?", "'", "¡",
              "¿", "[", "^", "`", "]",
              "+", "}", "{", "¨", "´",
              ">", "< ", ";", ",", ":",
              ".", " "),
            '',
            $string
          );
          return $string;
        }
        public static function notificar($primero = '', $segundo = '') {
          if ($primero == '' || $segundo == '') {
            echo 'Hubo un error en el procesamiento de la notificación.';
            return;
          }
          elseif ($primero != $segundo) {
            echo 'El archivo <strong>' . $primero . ' fue renombrado a <strong>' . $segundo . '</strong><br />';
            return;
          }
          else {
            echo 'El archivo <strong>' . $primero . '</strong> no fue renombrado.<br />';
            return;
          }
        }
        public static function renombrar($directorio = './') {
          if ($gestor = opendir($directorio)) {
            while (FALSE !== ($archivo = readdir($gestor))) {
              if ($archivo != '.' && $archivo != '..') {
                $old = $directorio . '/' . $archivo;
                $archivo = pathinfo($archivo);
                $new = $directorio . '/' . static::limpiar($archivo['basename']);
                if ($archivo['extension'] != "") {
                  $new .= '.' . $archivo['extension'];
                }
                rename($old, $new);
                static::notificar($old, $new);
              }
            }
            closedir($gestor);
          }
        }
      }
      

      Salu2!

      Responder
  17. Pingback: #php Reemplazar la ñ, acentos, espacios y caracteres especiales dichoso UTF-8 by @capynet | www.coudlain.com

  18. Juan Manuel

    Alguien conoce alguna función para limpiar que solo acepte caracteres alfanuméricos y también espacio, arroba y acentos? Tengo esta función:

    <?
    function clearString($text)
    {
    $result = preg_replace('([^A-Za-z0-9[:space:]])', '', $text);
     return $result;
     }
    

    Me falta agregar arroba y acentos.
    Gracias

    Responder
  19. Alerxs

    Hola muchachos despues de tanto luchar di con ustedes afortunadamente.
    En brebe tenia un foro phpbb3 y lo mude a mybb 1.6.10, cuando use el conversor si bien puse la misma codificacion UTF-8 me aparecieron casos muy particulares como “ó” = ó ; “Ô =í ; creo que es una buena opcion adaptar esto a mi sitio pero no se como ejecutarlo.
    Disculpen mi ignorancia, gracias y saludos! Alejandro.

    Responder
    1. Capy Autor

      Eso que comentas es un problema de codificación, y puede que los datos los tengas ya mal almacenados en la DB, como que puede que mybb esté interpretando los caracteres erróneamente… pueden ser mil cosas mas.
      Al margen de lo anterior, esta función que puse, la deberías usar como ultimo recurso. Antes trata de buscar en google cosas como “phpbb3 + mybb + utf” o “phpbb3 + mybb + encoding” y mira que solución están dando a este tipo de problema.

      Saludos.

      Responder
  20. Julio

    Encontre una funcion en internet parecida, no funcionaba si no decodificabas con utf8_encode al llamar a la funcion , he hecho el codigo para eliminar caracteres especiales de nombres de archivo, solo se debe indicar la carpeta:

    <?php

    function limpiar($String){
    $String = str_replace(array('á','à','â','ã','ª','ä'),"a",$String);
    $String = str_replace(array('Á','À','Â','Ã','Ä'),"A",$String);
    $String = str_replace(array('Í','Ì','Î','Ï'),"I",$String);
    $String = str_replace(array('í','ì','î','ï'),"i",$String);
    $String = str_replace(array('é','è','ê','ë'),"e",$String);
    $String = str_replace(array('É','È','Ê','Ë'),"E",$String);
    $String = str_replace(array('ó','ò','ô','õ','ö','º'),"o",$String);
    $String = str_replace(array('Ó','Ò','Ô','Õ','Ö'),"O",$String);
    $String = str_replace(array('ú','ù','û','ü'),"u",$String);
    $String = str_replace(array('Ú','Ù','Û','Ü'),"U",$String);
    $String = str_replace(array('[','^','´','`','¨','~',']'),"",$String);
    $String = str_replace("ç","c",$String);
    $String = str_replace("Ç","C",$String);
    $String = str_replace("ñ","n",$String);
    $String = str_replace("Ñ","N",$String);
    $String = str_replace("Ý","Y",$String);
    $String = str_replace("ý","y",$String);
    $String = str_replace(" ","_",$String);
    return $String;
    }

    echo " carpeta: “.$dirb=”B”;
    $directorio=opendir($dirb);
    while ($archivo = readdir($directorio)) {
    if($archivo != “.” && $archivo != “..”){
    echo ” archivo: “.$nuevo=limpiar(utf8_encode($archivo));
    rename(“$dirb/$archivo”,”$dirb/$nuevo”);
    }
    }
    closedir($directorio); // fin bucle

    ?>

    Responder
  21. Jean Claude Adams

    Hola,

    Paso este pedazo de codigo que me va bien tambien ami

    <?php
    public function sanitizeText($text)
    {
      $text = htmlentities($text, ENT_QUOTES, 'UTF-8');
      //$text = strtolower($text);
      $patron = array (
        // Espacios, puntos y comas por guion
        '/[\., ]+/' => ' ',
            		// Vocales
            		'/à/' => 'a',
            		'/è/' => 'e',
            		'/ì/' => 'i',
            		'/ò/' => 'o',
            		'/ù/' => 'u',
            		'/á/' => 'a',
            		'/é/' => 'e',
            		'/í/' => 'i',
            		'/ó/' => 'o',
            		'/ú/' => 'u',
                    '/Á/' => 'A',
                    '/É/' => 'E',
                    '/Í/' => 'I',
                    '/Ó/' => 'O',
                    '/Ú/' => 'U',
            		'/â/' => 'a',
            		'/ê/' => 'e',
            		'/î/' => 'i',
            		'/ô/' => 'o',
            		'/û/' => 'u',
            		'/ã/' => 'a',
            		'/&etilde;/' => 'e',
            		'/&itilde;/' => 'i',
            		'/õ/' => 'o',
            		'/&utilde;/' => 'u',
            		'/ä/' => 'a',
            		'/ë/' => 'e',
            		'/ï/' => 'i',
            		'/ö/' => 'o',
            		'/ü/' => 'u',
            		'/ä/' => 'a',
            		'/ë/' => 'e',
            		'/ï/' => 'i',
            		'/ö/' => 'o',
            		'/ü/' => 'u',
            		// Otras letras y caracteres especiales
            		'/å/' => 'a',
            		'/ñ/' => 'n',
                    '/Ñ/' => 'N',
            		// Agregar aqui mas caracteres si es necesario
            );
            $text = preg_replace(array_keys($patron),array_values($patron),$text);
            //$text = strtoupper($text);
            return $text;
        }
    
    Responder
    1. Esteban

      Hola a todos, e visto y probado casi todos los códigos y el código no funciona en una situación, ¿cómo se arregla? (a mi no me funciona esto)

      <?php

      $cadena1 = " $ test $ de simbolo $ ";

      $cadena1 = str_replace(
      array("\\", "¨", "º", "-", "~",
      "#", "@", "|", "!", "\"",
      "·", "%", "&", "/",
      "(", ")", "?", "'", "¡",
      "¿", "[", "^", "`", "]",
      "+", "}", "{", "¨", "´",
      ">", "

      eso me devuelve como resultado

      Notice: Undefined variable: query in C:\xampp\htdocs\ftech\otro.php on line 3
      Notice: Undefined variable: query in C:\xampp\htdocs\ftech\otro.php on line 3

      textarea = select * from producto mysql_query textarea

      porque el $ lo reemplaza solo si lo escribo solo y no seguido de un texto.
      La palabra $query la está leyendo literalmente

      HELP

      Responder
  22. Oscar

    Eres un diooooooooooooos!!
    Me sirvió y mucho. Generalmente en la base de datos creo una columna adicional a la cual nombro “nombre_web” y contiene el nombre normal (x ej. Escuela de Arte y Diseño) pero separado por guiones y todo en minúscula, pero con esto me ahorro el doble trabajo. Ojo que estoy usando PHP 5.4.29 en el hosting y en el WAMPSERVER 5.4.12. Porsiaca dejo las webs que estoy trabajando: bconferencias.editorialbruno.com.pe y bcard.editorialbruno.com.pe. Dejo el código (que modifiqué un poquito) para quien le sirva.
    Saludos desde Perú.

    <?
    function calatear_string($string){
    	$string = trim($string);
    	//Reemplazar tildes
    	$string = str_replace(
    		array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä'),
    		array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'),
    		$string
    	);
    	$string = str_replace(
    		array('é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë'),
    		array('e', 'e', 'e', 'e', 'e', 'e', 'e', 'e'),
    		$string
    	);
    	$string = str_replace(
    		array('í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î'),
    		array('i', 'i', 'i', 'i', 'i', 'i', 'i', 'i'),
    		$string
    	);
    	$string = str_replace(
    		array('ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô'),
    		array('o', 'o', 'o', 'o', 'o', 'o', 'o', 'o'),
    		$string
    	);
    	$string = str_replace(
    		array('ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü'),
    		array('u', 'u', 'u', 'u', 'u', 'u', 'u', 'u'),
    		$string
    	);
    	// Reemplazar Ñ y Ç
    	$string = str_replace(
    		array('ñ', 'Ñ', 'ç', 'Ç'),
    		array('n', 'n', 'c', 'c'),
    		$string
    	);
    	// Reemplazar Mayúsculas
    	$string = str_replace(
    		array(
    			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
    			'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'),
    		array(
    			'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    			'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'),
    		$string
    	);
    	// Reemplazar caracteres especiales
    	$string = str_replace(
    		array(
    			 "¡", "!", "", "¿", "?", "(", ")", "[", "]", "{", "}", "`", "´",
    			 "º", "ª", "|", "@", "·", "#", "~", "$", "%", "&", "€", "¬", "/", "'",
    			 "^", "*", "+", "¨", ";", ",", ":", ".", "\"", "\\"),
    			 '',
    		$string
    	);
    	// Aplicar guiones
    	$string = str_replace(
    		array('-', ' ', '_', '='),
    		'-',
    		$string
    	);
    	return $string;
    }
    
    Responder
  23. Oscar

    Por cierto, no sé si sea obvio pero a la función le puse de nombre “calatear_string” porque aquí en Perú Calato o Calatear significa Desnudo o Desnudar.
    Saludos!

    Responder
  24. Victor

    Simplemente ¡¡GRACIAS!!.

    Tengo una webapp para enviar SMS’s por una pasarela de email y estaba harto de los usuarios usaran caracteres no validos en el lenguaje SMS y al final llegaran mensajes rarunos, con la función he podido limpiar, lo que sale por SMS y lo que almaceno en el histórico de la BBDD.

    Gracias.

    Responder
  25. Pedro

    ¡Saludos!,

    Modifiqué el codigo y en este, reemplazo los espacion en blanco por guiones y devuelvo la cadena en minúsculas

    function limpiarCadena($cdnCnv){
    $cdnCnv = trim($cdnCnv);

    // Primero, elimino caracteres extraños
    $cdnCnv = str_replace(
    array(“\\”, “/”, “¨”, “º”, “~”, “#”, “@”, “€”, “*”, “|”, “¡”, “!”, “¿”, “?”, “\””, “‘”, “·”, “$”, “%”, “&”, “¬”,
    “(“, “)”, “{“, “}”, “[“, “]”, “”, “^”, “`”, “+”, “¨”, “´”, “;”, “,”, “:”, “.”, “=”, “©”, “®”, “&”),
    ”,
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘ñ’, ‘Ñ’, ‘ç’, ‘Ç’,’ ‘),
    array(‘n’, ‘N’, ‘c’, ‘C’,’-‘),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘á’, ‘à’, ‘ä’, ‘â’, ‘ª’, ‘Á’, ‘À’, ‘Â’, ‘Ä’),
    array(‘a’, ‘a’, ‘a’, ‘a’, ‘a’, ‘A’, ‘A’, ‘A’, ‘A’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘é’, ‘è’, ‘ë’, ‘ê’, ‘É’, ‘È’, ‘Ê’, ‘Ë’),
    array(‘e’, ‘e’, ‘e’, ‘e’, ‘E’, ‘E’, ‘E’, ‘E’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘í’, ‘ì’, ‘ï’, ‘î’, ‘Í’, ‘Ì’, ‘Ï’, ‘Î’),
    array(‘i’, ‘i’, ‘i’, ‘i’, ‘I’, ‘I’, ‘I’, ‘I’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘ó’, ‘ò’, ‘ö’, ‘ô’, ‘Ó’, ‘Ò’, ‘Ö’, ‘Ô’),
    array(‘o’, ‘o’, ‘o’, ‘o’, ‘O’, ‘O’, ‘O’, ‘O’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘ú’, ‘ù’, ‘ü’, ‘û’, ‘Ú’, ‘Ù’, ‘Û’, ‘Ü’),
    array(‘u’, ‘u’, ‘u’, ‘u’, ‘U’, ‘U’, ‘U’, ‘U’),
    $cdnCnv
    );

    // Devuelvo la cadena limpia, con espacios convertidos a -
    // y en minúscula
    return strtolower($cdnCnv);
    }

    Responder
  26. Pedro

    ¡Saludos!,

    Modifiqué el codigo y en este, reemplazo los espacios en blanco por guiones y devuelvo la cadena en minúsculas.

    <?php
    function limpiarCadena($cdnCnv){
    $cdnCnv = trim($cdnCnv);

    // Primero, elimino caracteres extraños
    $cdnCnv = str_replace(
    array("\\", "/", "¨", "º", "~", "#", "@", "€", "*", "|", "¡", "!", "¿", "?", "\"", "'", "·", "$", "%", "&", "¬",
    "(", ")", "{", "}", "[", "]", "”, “^”, “`”, “+”, “¨”, “´”, “;”, “,”, “:”, “.”, “=”, “©”, “®”, “&”),
    ”,
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘ñ’, ‘Ñ’, ‘ç’, ‘Ç’,’ ‘),
    array(‘n’, ‘N’, ‘c’, ‘C’,’-‘),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘á’, ‘à’, ‘ä’, ‘â’, ‘ª’, ‘Á’, ‘À’, ‘Â’, ‘Ä’),
    array(‘a’, ‘a’, ‘a’, ‘a’, ‘a’, ‘A’, ‘A’, ‘A’, ‘A’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘é’, ‘è’, ‘ë’, ‘ê’, ‘É’, ‘È’, ‘Ê’, ‘Ë’),
    array(‘e’, ‘e’, ‘e’, ‘e’, ‘E’, ‘E’, ‘E’, ‘E’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘í’, ‘ì’, ‘ï’, ‘î’, ‘Í’, ‘Ì’, ‘Ï’, ‘Î’),
    array(‘i’, ‘i’, ‘i’, ‘i’, ‘I’, ‘I’, ‘I’, ‘I’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘ó’, ‘ò’, ‘ö’, ‘ô’, ‘Ó’, ‘Ò’, ‘Ö’, ‘Ô’),
    array(‘o’, ‘o’, ‘o’, ‘o’, ‘O’, ‘O’, ‘O’, ‘O’),
    $cdnCnv
    );

    $cdnCnv = str_replace(
    array(‘ú’, ‘ù’, ‘ü’, ‘û’, ‘Ú’, ‘Ù’, ‘Û’, ‘Ü’),
    array(‘u’, ‘u’, ‘u’, ‘u’, ‘U’, ‘U’, ‘U’, ‘U’),
    $cdnCnv
    );

    // Devuelvo la cadena limpia, con espacios convertidos a -
    // y en minúscula
    return strtolower($cdnCnv);
    }
    ?>

    Responder
  27. Domin

    Muchísimas gracias por estos aportes tan buenos. Después deun día entero perdido por fin podré dormir tranquilo.

    Seguid así.

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>