Cambiar acentos en PHP

Uno de los problemas mas comunes es la parte de los acentos en la programación, nadie dice que no pueden utilizarce, al contrario, puedes utilizar cuantos caracteres especiales quieras, en especial si se trata de POO, pero no es nada aconsejable, en especial al utilizar lenguajes orientados a la web. ¿Entonces como solventamos esto? simple, con un arreglo dentro de una función.

<?php
  function cambiar_url($url) {
    $url = strtolower($url);
    $buscar = array(' ', '&', 'rn', 'n', '+');
    $url = str_replace ($buscar, '-', $url);
    $buscar = array('á', 'é', 'í', 'ó', 'ú', 'ñ');
    $remplzr = array('a', 'e', 'i', 'o', 'u', 'n');
    $url = str_replace ($buscar, $remplzr, $url);
    $buscar = array('/[^a-z0-9-<>]/', '/[-]+/', '/<[^>]*>/');
    $remplzr = array('', '-', '');
    $url = preg_replace ($buscar, $remplzr, $url);
    return $url;
  }
?>

   Así de simple es cambiar acentos por las mismas letras sin la tilde, y los espacios quedan con un guón. Entonces explicando todo paso a paso la función se compone de lo siguiente. Primero pasamos todo a minúscula:

$url = strtolower($url);

   Luego creamos un arreglo que contendrá los caracteres o símbolos a buscar, lo llamamos por ejemplo "$buscar", y otro con los que serán reemplazados en la misma posición del arreglo anterior, podemos llamarlo "$remplzr". Después de esto hacemos lo mismo pero con un arreglo para los acentos (sin usar otras variables para no complicarnos), y el último es para otros caracteres especiales, tanto el de los espacios como caracteres especiales los reemplazamos por un guión ( - ), pero podemos cambiarlo por cualquier otra cosa que queramos, de modo que va así la función con respecto a los arreglos.

//Primer arreglo
$buscar = array(' ', '&', 'rn', 'n', '+');
$url = str_replace ($buscar, '-', $url);

//Segundo arreglo
$buscar = array('á', 'é', 'í', 'ó', 'ú', 'ñ');
$remplzr = array('a', 'e', 'i', 'o', 'u', 'n');
$url = str_replace ($buscar, $remplzr, $url);

//Tercer arreglo    
$buscar = array('/[^a-z0-9-<>]/', '/[-]+/', '/<[^>]*>/');
$remplzr = array('', '-', '');
$url = preg_replace ($buscar, $remplzr, $url);
return $url;

   Por último retornamos la variable y listo, ya solo queda llamar la función desde nuestro PHP.

<?php cambiar_url($mi_cadena) ?>

   Recomiendo utilizar esto mas que todo para un arreglo donde tengamos muchos enlaces con acentos o cuando cargamos data de una base de datos como nombres y queremos utilizarlos en enlaces y propiedades, todo es cuestión de probar y comprar resultados.


9 Comentarios

Escribir Comentario
Anónimo
AUTOR
23 de noviembre de 2011, 12:36 delete

hola
tu post me ha sido de gran utilidad, pero tengo una pregunta que de pronto sabes...
He ejecutado la función para construir urls amigables en una serie de links, las url's van bien con su correspondiente función en el .htaccess, pero la info del link, pasa modificada al archivo que la ejecuta... y no la reconoce..
Conoces alguna forma de devolver la función (en este caso volver a poner las tildes) después de constrida la url, y antes de que pase al archivo de destino ????

Responder
avatar
23 de noviembre de 2011, 12:41 delete

Bueno, tienes 2 posibles soluciones:
- La primera es que cuentes la cantidad de caracteres antes de cada acento en cada palabra y retornes el valor.
- La otra es que almacenes en la variable los acentos como tal y solo utilices la función para lo que vayas a utilizar, de forma que cuando quieras mostrar la cadena original muestres la variable que no ha sido modificada en ningún momento.

También, si lo vez complicado, crea 2 variables, una con la cadena sin acentos y otra con la original... Saludos!

Responder
avatar
Anónimo
AUTOR
23 de noviembre de 2011, 13:16 delete

Me parece que la última opción sería la mejor, porque los datos que van al archivo de destino son muchos y muy diferentes (es un archivo de búsqueda para nombres en php), pero lo he intentado y no me funciona, no ejecuta la función con la cadena original, te pongo un ejemplo de como estoy construyendo los links, depronto ahí esta el fallo:

' . $product_info['nombre'] . ''
?>

el cambio lo ejecuto en el .htaccess así:

RewriteRule ^nombre-(.*).html$ archivo_busqueda.php?nombre=$1&% [QSA,NC,L]

y luego tengo la función para conservar el original no se como escribirla, se me ocurre algo asi, aunque creo que esta mal...

Responder
avatar
Anónimo
AUTOR
23 de noviembre de 2011, 13:19 delete

Lo siento... tu ventana me da error al intentar insertar el código etiquetado,

Responder
avatar
23 de noviembre de 2011, 13:23 delete

Bueno, primero tienes que formatearlo, fíjate en la primera entrada del blog, tienes el parse para publicar código, ahora bien....

Si lo que quieres hacer es en PHP para que utilizas el .htaccess? No es mas simple utilizar el método POST o GET? Y si lo que quieres es algo en tiempo real, pues tienes jQuery, .htaccess no debería usarse para este tipo de cosas....

Responder
avatar
Anónimo
AUTOR
23 de noviembre de 2011, 13:45 delete

La verdad es que he tomado cosas de aquí y de allí para intentar construir la solución, pero no soy programador...
Estoy usando el hatccess para hacer la reescritura de la url, ahí se hace el cambio de la variable nombre, por el nombre real.
Pero la función de búsqueda que esta en archivo_busqueda.php, ejecuta el nombre ya cambiado con tu función (para eliminar tildes, mayusculas etc... en la url), la función se ejecuta bien, y la url va bien, pero necesito recuperar el nombre original (con tildes, etc..) para construir los títulos en el archivo de destino (archivo_busqueda.php)
Vuelvo a poner el link:
<?php
&apos;<br><a href="&apos; . cambiar_url($product_info[&apos;nombre&apos;]) . &apos;" />&apos; . $product_info[&apos;nombre&apos;] . &apos;</a>&apos;
?>

Responder
avatar
23 de noviembre de 2011, 14:22 delete

Bueno, ahora hazte con una variable por url, por ejemplo:

echo "href=".cambiar_url($product_info['nombre'])."&texto_original=".$product_info;

Y dentro del archivo de busqueda para recuperar la variable colocas:

$el_texto = $_GET['texto_original'];

Espero no enredarte mucho... Aún el blog lo tengo en construcción y no he modificado el post de códigos en los comentarios.... Saludos!!

Responder
avatar
Anónimo
AUTOR
23 de noviembre de 2011, 15:43 delete

creo que me voy acercando ...
pero no me va la función, la he escrito así:

function texto_original($string) {

$nombre = trim($string);

return $nombre;
}

también he intentado hacer un preg_replace_callback, pero tampoco me funciona.

Responder
avatar
23 de noviembre de 2011, 16:34 delete

No entiendo porque haces esto.... Pero dime algo, sabes como funciona el GET de PHP?? Si no es así te recomiendo leas un poco la documentación: $_GET['variable']

Partiendo de esto:

echo "href=archivo_busqueda.php".cambiar_url($product_info['nombre'])."&texto_original=".$product_info['nombre'];

Y en tu archivo php (el del enlace que es archivo_busqueda.php) colocas esto:

$nombre = $_GET['texto_original'];

Y si quieres hacer un trim entonces puedes hacer:

$nombre = trim($_GET['texto_original']);

O también:

$nombre = $_GET['texto_original'];
$nombre = trim($nombre);

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión