Remplacer efficacement tous les caractères accentués dans une chaîne ?
Je1 cherche à améliorer les fonctions de comparaison de chaînes dans ma classe JavaScript.
Actuellement, ils utilisent string.replace() pour effectuer une global (g) recherche et remplace tous les caractères accentués d'une chaîne (p{InCombiningDiacriticalMarks} ) par leur forme de base (décomposition canonique à l'aide de NFD).
La recherche dans la chaîne d'entrée, même de quelques caractères accentués, donne des résultats assez étendus taux de désabonnement - et lors de la recherche d'entrées plus volumineuses, les performances peuvent devenir lentes.
Existe-t-il un moyen plus efficace d'accomplir ceci ?
[1] Modifier - Clarification du problème général.
Cette opération est effectuée pour convertir les caractères allemands accentués en leur forme non accentuée, de sorte que lors du tri des chaînes dans le "mauvais" ordre (par exemple, le tréma se terminant avant le "a" non-tréma), ils peuvent être triés correctement conformément aux réglementations locales. attentes.
Il n'est donc pas suffisant de simplement rechercher les caractères accentués et de les remplacer par leur équivalent non accentué - il faut remplacer les formes accentuées par leur base équivalent.
Une normalisation non ou incorrecte peut entraîner un mauvais ordre de tri.
[Modifier 2]
Pour la mise en œuvre par un pauvre d'un tri quasi-collation-correct côté client, j'ai besoin d'une fonction JavaScript qui effectue efficace le remplacement d'un seul caractère dans une chaîne.
Voici ce que je veux dire (notez que cela s'applique au texte allemand, les autres langues trient différemment) :
native sorting gets it wrong: a b c o u z ä ö ü collation-correct would be: a ä b c o ö u ü z
Fondamentalement, j'ai besoin que toutes les occurrences de "ä" d'une chaîne donnée soient remplacées par "a" (et ainsi de suite). De cette façon, le résultat du tri natif serait très proche de ce à quoi un utilisateur s'attendrait (ou de ce qu'une base de données renverrait).
D'autres langages ont des fonctionnalités pour faire exactement cela : Python fournit str.translate(), dans Perl il y a tr/…/…/, XPath a une fonction translate(), ColdFusion a ReplaceList(). Mais qu'en est-il de JavaScript ?
Voici ce que j'ai en ce moment.
// s would be a rather short string (something like // 200 characters at max, most of the time much less) function makeSortString(s) { var translate = { "ä": "a", "ö": "o", "ü": "u", "Ä": "A", "Ö": "O", "Ü": "U" // probably more to come }; var translate_re = /[öäüÖÄÜ]/g; return ( s.replace(translate_re, function(match) { return translate[match]; }) ); }
Pour commencer, je n'aime pas le fait que l'expression régulière soit reconstruite à chaque fois que j'appelle la fonction. Je suppose qu'une fermeture peut aider à cet égard, mais je ne semble pas y parvenir pour une raison quelconque.
Quelqu'un peut-il penser à quelque chose de plus efficace ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!