Reemplazar la ñ, acentos, espacios y caracteres especiales con PHP [Actualizada]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
< ?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("\", "¨", "º", "-", "~", "#", "@", "|", "!", """, "·", "$", "%", "&", "/", "(", ")", "?", "'", "¡", "¿", "[", "^", "<code>", "]", "+", "}", "{", "¨", "´", ">", "< ", ";", ",", ":", ".", " "), '', $string ); return $string; } |
Ejemplo de uso:
1 2 3 4 5 |
<!--?php echo sanear_string("áàäâªÁÀÂÄdoéèëêÉÈÊËreíìïîÍÌÏÎmióòöôÓÒÖÔfaúùüûÚÙÛÜsolñÑçÇlasi\¨º-~#@|!,·$%&/()?¡¿[^</code>]+}{¨´>< ;,:. "); </pre> <p>Lo anterior imprime:<br ?--> [code]"aaaaaAAAAdoeeeeEEEEreiiiiIIIImiooooOOOOfauuuuUUUUsolnNcClasi"[/code] |
Pingback: Reemplazar la ñ, acentos y espacios en PHP | Capy.net
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
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:
Hola, bueno, yo tengo un problema con la codificacion por algo en el servidor, si no funciona, podes hacer
sanear_string(utf8_encode($string))
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.
Excelente, pequeño fragmento de codigo que hace una enorme diferencia. Muchas gracias bro. Dtb
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);
?>
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.
de nada 🙂
Tio dpm!
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: ♡ | ♥ | ★ | ♀ | ♂ | ♠ | ♤ | ♣ | ♧ | © | ± | ☺ | ☻ | ☼ | ☎ | ♨ | ☞ | ♩ | ♪ | ♫
Muchas, pero muchas gracias por esta maravillosa solucion! Abrazos!
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
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.
¿Porque no cerraste las comillas al final?
mmm puede ser que haya copiado&pegado sin darse cuenta.
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
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.
Eres lo máximo! Me he peleado infinitas veces con esto.
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
Muchas gracias!!
Genial Hermano con esa del $fila[1]=limpiar_caracteres_especiales(utf8_encode($fila[1])); justo asi si me funciono.
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!
ni idea. lo siento.
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!!
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;
}
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!!
Jajaja muy bueno lo de Úña Cäña b´¨ieñ Fr-èsqüíta.
Gracias a vos!
Excelente este código..
Anda, gracias 🙂
Buen Blog.
gracias por el aporte.
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.
Uy, por lo que veo no salió el código bien. El código completo en: este enlace (está en Dropbox).
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!
Me ha servido mucho tu ejemplo, gracias!
Me ha servido de gran ayuda ! Gracias 😉 !
Pingback: #php Reemplazar la ñ, acentos, espacios y caracteres especiales dichoso UTF-8 by @capynet | www.coudlain.com
Gracias amigo, me resulto muy útil
lo programaste muy bien Master!
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
Me das un ejemplo? decime que entra y que deberia salir porfa.
FYI
La he probado con PHP 5.3.13 ynada que me sirve 🙁
Manuel que raro, estoy sobre PHP 5.4.9 y va bien. Me decis que mensaje te da asi lo corrijo?
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.
Resdon, el php del sitio actual es 5.3.25
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.
Mil Gracias! me resulto de maravilla
Muy útil y muy bien explicado, gracias!
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
?>
Hola,
Paso este pedazo de codigo que me va bien tambien ami
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
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!
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ú.
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.
¡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);
}
¡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);
}
?>
Muchísimas gracias por estos aportes tan buenos. Después deun día entero perdido por fin podré dormir tranquilo.
Seguid así.
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.
excelente
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.
Sos un genio. Gracias!!!!!
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.
Genial muchas gracias!