php-header

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

Ejemplo de uso:

63 Comments

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

  • RAM 18/03/2011

    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

  • Capy 19/03/2011

    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:

  • Gustavo 10/06/2011

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

    • henry 21/09/2014

      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.

    • sudogo 13/05/2015

      Excelente, pequeño fragmento de codigo que hace una enorme diferencia. Muchas gracias bro. Dtb

  • Pineda 02/08/2011

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

    ?>

  • diego 05/09/2011

    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.

  • Capy 05/09/2011

    de nada 🙂

  • Alex 14/10/2011

    Tio dpm!

  • Ignacio 04/01/2012

    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: ♡ | ♥ | ★ | ♀ | ♂ | ♠ | ♤ | ♣ | ♧ | © | ± | ☺ | ☻ | ☼ | ☎ | ♨ | ☞ | ♩ | ♪ | ♫

  • iGaspa 25/01/2012

    Muchas, pero muchas gracias por esta maravillosa solucion! Abrazos!

  • stratovare 11/04/2012

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

    lo quiero hacer de la siguiente manera:

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

    • Capy 12/04/2012

      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.

    • Bryan Horna 03/05/2013

      ¿Porque no cerraste las comillas al final?

      • Capy 04/05/2013

        mmm puede ser que haya copiado&pegado sin darse cuenta.

  • SErgio 23/05/2012

    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

  • Capy 29/05/2012

    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.

  • Alejandro Alcantara 14/08/2012

    Eres lo máximo! Me he peleado infinitas veces con esto.

  • AsderPunk 14/08/2012

    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:

  • Muy funcional esta funcion, aunque me dio problemas para no quitar los espacios en blancos. Saludos

  • Alexander 03/09/2012

    Muchas gracias!!

  • Henry 02/01/2013

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

  • Lucas 25/02/2013

    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!

    • Capy 25/02/2013

      ni idea. lo siento.

  • Arturo Vallone 07/03/2013

    Yo lo resolví de esta forma:

    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!!

    • Mercedes 20/12/2013

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

  • Rodolfo 19/03/2013

    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!!

    • Capy 19/03/2013

      Jajaja muy bueno lo de Úña Cäña b´¨ieñ Fr-èsqüíta.
      Gracias a vos!

  • Christian 17/04/2013

    Excelente este código..

    • Capy 17/04/2013

      Anda, gracias 🙂

  • john 29/04/2013

    Buen Blog.
    gracias por el aporte.

  • Bryan Horna 04/05/2013

    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:

    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.

    • Bryan Horna 04/05/2013

      Uy, por lo que veo no salió el código bien. El código completo en: este enlace (está en Dropbox).

    • Capy 04/05/2013

      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.

      Salu2!

  • Pablo 09/05/2013

    Me ha servido mucho tu ejemplo, gracias!

  • Adonai 13/05/2013

    Me ha servido de gran ayuda ! Gracias 😉 !

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

  • David 18/06/2013

    Gracias amigo, me resulto muy útil
    lo programaste muy bien Master!

  • Juan Manuel 02/07/2013

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

    Me falta agregar arroba y acentos.
    Gracias

    • Capy 02/07/2013

      Me das un ejemplo? decime que entra y que deberia salir porfa.

  • Manuel 19/07/2013

    FYI
    La he probado con PHP 5.3.13 ynada que me sirve 🙁

    • Capy 22/07/2013

      Manuel que raro, estoy sobre PHP 5.4.9 y va bien. Me decis que mensaje te da asi lo corrijo?

  • Alerxs 15/08/2013

    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.

    • Alerxs 15/08/2013

      Resdon, el php del sitio actual es 5.3.25

    • Capy 18/08/2013

      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.

  • Jaime 15/01/2014

    Mil Gracias! me resulto de maravilla

  • elias 18/01/2014

    Muy útil y muy bien explicado, gracias!

  • Julio 06/02/2014

    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

    ?>

  • Jean Claude Adams 20/02/2014

    Hola,

    Paso este pedazo de codigo que me va bien tambien ami

    • Esteban 02/05/2014

      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:xampphtdocsftechotro.php on line 3
      Notice: Undefined variable: query in C:xampphtdocsftechotro.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

  • Oscar 18/07/2014

    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!

  • Oscar 18/07/2014

    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ú.

  • Victor 01/08/2014

    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.

  • Pedro 21/08/2014

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

  • Pedro 21/08/2014

    ¡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);
    }
    ?>

  • Domin 05/10/2014

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

    Seguid así.

  • Ignacio 25/11/2014

    Creo que buscan esto:

    $string = “Hola qué tal”
    preg_match(“^[p{L}a-z0-9s]+$/u”, $string)

    Test: http://www.phpliveregex.com/p/8o5

    Saludos.

  • JOEL MORA 13/05/2015

    excelente

  • Carlos Torres 31/10/2015

    Hola que tal, disculpa la molestia, me da como error la última línea, he cambiado las comillas pero nada; me podrías ayudar por favor.

  • Cristian 01/05/2016

    Sos un genio. Gracias!!!!!

  • nayeli 27/09/2016

    hola, Estoy usando la función dentro de un for cuando da la primera vuelta todo bien pero para la segunda me manda un error Fatal error: Cannot redeclare sanear_string() . Espero me puedan ayudar.

  • Luisa 06/10/2016

    Genial muchas gracias!

:).