Los Foros
http://foros.espaciolatino.com/

Al realizar busquedas ignorar los acentos
http://foros.espaciolatino.com/viewtopic.php?f=2&t=662
Página 1 de 1

Autor:  Chess_65 [ 22 Nov 2013 12:17 ]
Asunto:  Al realizar busquedas ignorar los acentos

Tengo una búsqueda sobre un array y en este hay elementos con acentos, así que necesito que al escribir el texto de búsqueda en el input y realizar dicha búsqueda, no tenga en cuenta si en el texto escrito o en el que figura en el array las palabras están acentuadas o no y por tanto las encuentre de cualquier manera, pero lógicamente necesito que las muestre tal cual están escritas en el array.
La función de búsqueda me hace esto mismo pero con las mayúsculas, pero en el caso de los acentos no sé como hacerlo.
Esta es la función de búsqueda
Código:
 function busca(buscar) {
    encontrados=new Array();
   for(var i=0; i<nombre.length; i++) {
         var nodoLower=nombre[i][0].toLowerCase();
   if(nodoLower.indexOf(buscar.toLowerCase())!=-1) {
             encontrados.push(nombre[i]);
        }
    }


Saludos

Autor:  editor [ 24 Nov 2013 02:01 ]
Asunto:  Re: Al realizar busquedas ignorar los acentos

Sólo se me ocurre que cambies los acentos por letras sin acentos y luego compares
cadena ="león";
cadena_cmp = cadena.replace("á", "a");
cadena_cmp = cadena_cmp.replace("é", "e");
cadena_cmp = cadena_cmp.replace("í", "i");

Y así con todas las letras acentuadas. Es la forma más simple. También podrías crear un array asociativo. A cada letra acentuada le corresponde la misma sin acentuar.
acentos['á'] = 'a'
acentos['é'] = 'e'


De todas formas ¿has probado con localeCompare()?, este método compara la cadena con otra según el idioma definido en el navegador.

Saludos

Autor:  Chess_65 [ 25 Nov 2013 13:44 ]
Asunto:  Re: Al realizar busquedas ignorar los acentos

Siguiendo lo que me comentas he creado esta funcion
Código:
function reemplazaAcentos(cadena){ 
    var cadena_acentos = "áéíóú";
    var cadena_reemplaza = "aeiou";
    for(var i=0; i<cadena_acentos.length; i++ ){
        cadena = cadena.replace(cadena_acentos[i],cadena_reemplaza[i]);
    }
    return cadena;
}

Pero ahora, necesito integrarla en la función de búsqueda, que es la de abajo, como puedo integrar las dos funciones.
txtBuscar.value es el input donde se introduce el texto a buscar
Código:
function busqueda(){
var cadena=txtBuscar.value.toLowerCase();
    var n = nombre.length;
    buscarNombre = [];   
   for (var i=0;i<n;i++)
    {      
        if (nombre[i][1].toLowerCase().indexOf(cadena)>=0)
        {
            buscarNombre.push(datos[i]);
        }
    }
    txtResultados.innerHTML=buscarNombre.length;
    mostrarResultados(0);   
}


Saludos

Autor:  editor [ 25 Nov 2013 18:57 ]
Asunto:  Re: Al realizar busquedas ignorar los acentos

Hola
Pues yo cambiaría las cadenas que comparas con las cadenas sin acento

Tienes esto
nombre[i][1].toLowerCase().indexOf(cadena)

Lo desgloso y organizo un poco
buscaren = reemplazaAcentos(nombre[i][1])
loBuscado = reemplazaAcentos(cadena)

buscaren.toLowerCase().indexOf(loBuscado)

Es decir en lugar de usar las cadenas originales cámbialas por las modificadas (sin acentos)

Saludos

Autor:  Chess_65 [ 26 Nov 2013 20:35 ]
Asunto:  Re: Al realizar busquedas ignorar los acentos

Tu propuesta funciona perfectamente pero.....
Para dejar limpio el archivo HTML he pasado todo el código JavaScript a un archivo externo js y me ha dejado de funcionar, me explico, tengo creada una función para validar el texto que se introduce en el input y al poner una palabra acentuada para que la busque, que existe en el array y está acentuada me salta el alert de error de caracter no permitido y si la pongo sin acentuar me dice que no la encuentra, pero si esta función la dejo en el archivo HTML entonces la búsqueda funciona perfectamente.
No sé si es que esta función tiene que estar en el mismo archivo que el input.
También tengo que dejar en el archivo HTML la función reemplazaAcentos porque sino me dice que reemplazaAcentos no está definido.
Te pongo la función y el input

Código:
function filtrarResultados(){
    var reg = /^([a-z][a-z0-9 ñáéíóú]{2,10})$/i;   
   //valida que el texto del campo no sea el que aparece automáticamente al tener el foco
   if (txtBuscar.value == textoBusqueda){
      alert("\u00A1Por favor! \n escriba el texto de b\u00fasqueda");
      return false;
   //valida que el campo no esté vacío, no tenga sólo espacios en blanco, ni caracteres especiales   
   }else if(reg.test(txtBuscar.value) == 0){
        alert("El texto debe tener entre 3 y 10 \ncaracteres.\nNo empezar por un n\u00famero y \nNo contener caracteres especiales");   
      return false;
   }else   
      busqueda()
      return true;            
}

<input type="text" name=text1 id="buscador" size="30" maxlength="25" />

Página 1 de 1 Todos los horarios son UTC + 1 hora
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/