Foros del Web » Programando para Internet » PHP »

Problema con eliminación de acentos en caracteres

Estas en el tema de Problema con eliminación de acentos en caracteres en el foro de PHP en Foros del Web. He realizado una función para convertir cadenas en segmentos SEF (para URL's amigables). El problema es que no consigo que los caracteres con acentos sean ...
  #1 (permalink)  
Antiguo 18/01/2012, 13:43
Avatar de Mikimoto74  
Fecha de Ingreso: enero-2005
Mensajes: 88
Antigüedad: 19 años, 11 meses
Puntos: 2
Problema con eliminación de acentos en caracteres

He realizado una función para convertir cadenas en segmentos SEF (para URL's amigables). El problema es que no consigo que los caracteres con acentos sean cambiados, permanecen exactamente igual. Esta es la función:

Código PHP:
function get_ruta_sef($ruta) {
        
// echo $ruta; exit;
    
$ruta mb_strtolower($ruta);
    
$ruta str_split($ruta1); // Forma rápida de convertir cadena en array
    
$ruta_final '';
    
$conversiones = array(
                    
' ' => '-',
                    
'_' => '-',
                    
'&' => '-and-',
                    
'á' => 'a',
                    
'é' => 'e',
                    
'í' => 'i',
                    
'ó' => 'o',
                    
'ú' => 'u',
                    
'ñ' => 'n',
                    
'ü' => 'u',
                    
'à' => 'a',
                    
'è' => 'e',
                    
'ì' => 'i',
                    
'ò' => 'o',
                    
'ù' => 'u',
                    
'!' => '',
                    
'º' => '',
                    
'ª' => '',
                    
'@' => '',
                    
'#' => '',
                    
'"' => '',
                    
"'" => '',
                    
'$' => '',
                    
'%' => '',
                    
'·' => '',
                    
')' => '-',
                    
'(' => '-',
                    
'=' => '',
                    
'?' => '',
                    
'¿' => '',
                    
'¡' => '',
                    
'*' => '',
                    
'`' => '',
                    
'[' => '-',
                    
']' => '-',
                    
'+' => '-',
                    
'¨' => '',
                    
'´' => '',
                    
'{' => '',
                    
'}' => '',
                    
';' => '-',
                    
',' => '-',
                    
'.' => '-',
                    
':' => '-',
                    
'¬' => '',
                    
'|' => '',
                    
'ç' => 'c',
                    
'Ç' => 'c'
                    
);
    foreach (
$ruta as $char) {
        
$ruta_final .= (array_key_exists($char$conversiones) ? $conversiones[$char] : $char);
    }
        
$ruta_final preg_replace('/[\-]{2,}/''-'$ruta_final); // agrupar guiones consecutivos en uno solo
    
return $ruta_final;

Usando esta función, la cadena "Yo innovo, tu innovas, él innova" de un título de artículo, que quiero usar como alias en una URL para su identificación, se convierte en "yo-innovo-tu-innovas-él-innova".

Como veis el acento no es cambiado, a pesar de que "é" tiene su equivalencia en "e" en el array. Lo más extraño es que si descomento el echo de la primera línea de la función, muestra la cadena tal cual tanto el navegador como el código fuente: "Yo innovo, tu innovas, él innova"
o sea, no está recibiendo caracteres extraños ni equivalencias html en vez del carácter acentuado. Vamos que es como si ignorase la sustitución de los caracteres acentuados.

Cualquier ayuda es bienvenida.
  #2 (permalink)  
Antiguo 18/01/2012, 16:03
Avatar de Mikimoto74  
Fecha de Ingreso: enero-2005
Mensajes: 88
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: Problema con eliminación de acentos en caracteres

Ya he encontrado la solución. La pongo por si sirve a alguien:

en vez de hacer el str_split() y luego el foreach() basta con usar símplemente

$ruta = strtr($ruta, $conversiones) y esta función ya se encarga de realizar las conversiones en la cadena $ruta según se establece en los pares del array $conversiones.
  #3 (permalink)  
Antiguo 18/01/2012, 16:46
 
Fecha de Ingreso: julio-2010
Mensajes: 393
Antigüedad: 14 años, 4 meses
Puntos: 67
Respuesta: Problema con eliminación de acentos en caracteres

Hola, mira, no pretendo ver de menos lo que has conseguido... de hecho, ya eres un verdadero crack, no como la gente experta en copy/paste...

te dejo una función que puede servirte para lo que necesitas.

Código PHP:
Ver original
  1. <?
  2.     setlocale(LC_ALL, 'en_US.UTF8');
  3.     function limpiar_string($str, $replace = array(), $delimiter = '_'){
  4.         if(!empty($replace)){
  5.             $str = str_replace((array)$replace, ' ', $str);
  6.         }
  7.         $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  8.         $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
  9.         $clean = strtolower(trim($clean, '-'));
  10.         $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
  11.         return $clean;
  12.     }
  13. ?>

Espero que te sirva,
Saludos!

PD: el setlocale es importante, no lo omitas.
__________________
Páginas web de alta calidad y hechas a la medida.
  #4 (permalink)  
Antiguo 06/07/2012, 18:25
Avatar de Mikimoto74  
Fecha de Ingreso: enero-2005
Mensajes: 88
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: Problema con eliminación de acentos en caracteres

Gracias por aportar tu punto de vista

Etiquetas: acentos, caracteres, sef, tildes
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:19.