Utiliser JavaScript pour effectuer des correspondances de texte avec / sans caractères accentués
Je suis en utilisant une base d'AJAX de recherche pour les noms qu'un utilisateur effectue une recherche dans une zone de texte.
Je fais l'hypothèse que tous les noms dans la base de données sera transcrit pour les alphabets Européens (c'est à dire pas le Cyrillique, Japonais, Chinois). Toutefois, les noms seront toujours contenir de caractères accentués, tels que ç, ê et même č et æ.
Une simple recherche comme "Micic" correspondent à "Mičić" si - et l'utilisateur s'attend à ce que il va.
L'AJAX de recherche utilise des expressions régulières pour déterminer une correspondance. J'ai modifié l'expression régulière de la comparaison à l'aide de cette fonction dans une tentative de faire correspondre plus les caractères accentués. Cependant, il est un peu maladroit car il ne prend pas en compte tous les caractères.
function makeComp (input)
{
input = input.toLowerCase ();
var output = '';
for (var i = 0; i < input.length; i ++)
{
if (input.charAt (i) == 'a')
output = output + '[aàáâãäåæ]'
else if (input.charAt (i) == 'c')
output = output + '[cç]';
else if (input.charAt (i) == 'e')
output = output + '[eèéêëæ]';
else if (input.charAt (i) == 'i')
output = output + '[iìíîï]';
else if (input.charAt (i) == 'n')
output = output + '[nñ]';
else if (input.charAt (i) == 'o')
output = output + '[oòóôõöø]';
else if (input.charAt (i) == 's')
output = output + '[sß]';
else if (input.charAt (i) == 'u')
output = output + '[uùúûü]';
else if (input.charAt (i) == 'y')
output = output + '[yÿ]'
else
output = output + input.charAt (i);
}
return output;
}
En dehors de la fonction de substitution comme cela, est-il un meilleur moyen? Peut-être à "deaccent" la chaîne par rapport?
source d'informationauteur Philip
Vous devez vous connecter pour publier un commentaire.
cela devrait vous aider: sa appelés accent pliage:
http://alistapart.com/article/accent-folding-for-auto-complete
Venu sur ce vieux thread et j'ai pensé m'essayer à faire une fonction rapide. Je suis plutôt de l'ordre des tuyaux séparés ORs de la définition de variables quand elles correspondent à la fonction replace() de l'appelant. Mon but était d'utiliser la norme regex mise en œuvre javascript de la fonction de remplacement() utilise autant que possible, de sorte que le lourd traitement peut avoir lieu dans les bas-niveau un navigateur optimisé de l'espace, au lieu de dans cher javascript char par char comparaisons.
Ce n'est pas du tout scientifique, mais ma vieille Huawei IDEOS téléphone android est très lent lorsque je branche les autres fonctions de ce fil à ma saisie semi-automatique, alors que cette fonction ne s'arrête pas:
Si vous êtes un jQuery dev, voici un exemple pratique de l'utilisation de cette fonction; vous pourriez utiliser :icontains de la même façon que vous souhaitez utiliser :contient un sélecteur:
Il n'y a pas de moyen plus facile de "deaccent" que je peux penser, mais votre substitution pourrait être simplifié un peu plus:
J'ai fait une Version Prototype de ce:
À utiliser comme:
Cela va changer la Chaîne de a_o_u_A_O_U_ss
Je cherchais quelque chose de similaire, mais au lieu de créer une expression régulière, je voulais juste remplacer les caractères accentués à leurs équivalents ASCII. Inspiré par 999 réponse et d'un article sur A List Apart (http://www.alistapart.com/articles/accent-folding-for-auto-complete/) je suis venu op avec la fonction suivante. Il peut être modifié pour des implémentations spécifiques de cours:
utilisation:
D'abord, je vous recommande une instruction switch au lieu d'une longue chaîne de if-else if ...
Puis, je ne suis pas sûr de savoir pourquoi vous n'aimez pas votre solution actuelle. C'est certainement le plus propre. Que voulez-vous dire en ne prenant pas en compte "tous les caractères"?
Il n'existe pas de méthode standard en JavaScript pour carte avec les lettres accentuées ASCII des lettres en dehors de l'utilisation d'une bibliothèque tierce, de sorte que celui que vous avez écrit est aussi bon que tout.
Aussi, "ß" je crois que les cartes "ss", pas un seul "s". Et méfiez-vous du "je" avec et sans point en turc-je crois qu'elles se réfèrent à des lettres différentes.
Vous pouvez également utiliser http://fusejs.io pour une recherche floue.