Mit JavaScript durchführen, text-matches mit/ohne Sonderzeichen
Bin ich mit einer AJAX-basierten Suche nach Namen, die ein Benutzer sucht in einer text-box.
Ich bin die Annahme, dass alle Namen in der Datenbank werden transliteriert zu europäischen Alphabeten (d.h. kein Kyrillisch, Japanisch, Chinesisch). Allerdings, die Namen werden noch enthalten Sie Sonderzeichen wie ç, ê und sogar č und ć.
Einer einfachen Suche wie "Micic" nicht mit "Mičić" aber - und die user-Erwartung ist, dass es wird.
Den AJAX-lookup verwendet reguläre Ausdrücke, um zu bestimmen, eine übereinstimmung. Ich habe modifiziert den regulären Ausdruck-Vergleich mit dieser Funktion in einem Versuch entsprechend mehr Zeichen mit Akzent. Jedoch, es ist ein wenig umständlich, da es nicht berücksichtigt, alle Zeichen.
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;
}
Abgesehen von einer substitution Funktion wie diese, gibt es eine bessere Möglichkeit? Vielleicht zu "deaccent" die Zeichenfolge, die verglichen werden?
InformationsquelleAutor der Frage Philip | 2011-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
helfen sollte: die genannte accent folding:
http://alistapart.com/article/accent-folding-for-auto-complete
InformationsquelleAutor der Antwort herostwist
Kam auf diesen alten thread und dachte, ich würde versuchen, meine hand auf tun, eine schnelle Funktion. Ich verlasse mich auf die Bestellung von Rohr-getrennt ORs setzen von Variablen, wenn Sie übereinstimmen in der Funktion ersetzen() aufruft. Mein Ziel war es, die standard-regex-Implementierung von javascript replace () - Funktion verwendet, so viel wie möglich, so dass die heavy-Verarbeitung stattfinden kann, die in low-level-browser-optimierten Raum, statt in teure javascript-char-by-char-Vergleiche.
Es ist nicht wissenschaftlich, aber meine alten Huawei IDEOS android-Handy wird träge, wenn ich stecken Sie das andere Funktionen in diesem thread in meinem autocomplete, während diese Funktion Reißverschlüssen entlang:
Wenn Sie ein jQuery-dev, hier ist ein praktisches Beispiel für die Verwendung dieser Funktion, den Sie verwenden könnten :icontains die gleiche Weise, die Sie verwenden würden :enthält in einem Selektor:
InformationsquelleAutor der Antwort Josh from Qaribou
Gibt es keinen einfacheren Weg, die "deaccent", die ich mir vorstellen kann, aber Ihre substitution gestrafft werden könnten ein wenig mehr:
InformationsquelleAutor der Antwort James
Machte ich eine Prototyp-Version:
Verwenden wie:
Dies wird sich ändern Sie die Zeichenfolge a_o_u_A_O_U_ss
InformationsquelleAutor der Antwort Jan Hagge
War ich auf der Suche nach etwas ähnliches, aber statt einen regulären Ausdruck, den ich nur ersetzen wollte akzentuierte Zeichen in Ihre ASCII-äquivalente. Inspiriert von 999 die Antwort, und ein Artikel bei A List Apart (http://www.alistapart.com/articles/accent-folding-for-auto-complete/) ich kam die op mit der folgenden Funktion. Es kann geändert werden, für spezifische Implementierungen natürlich:
Verwendung:
InformationsquelleAutor der Antwort Mark van Dijk
Habe ich gesucht und von Ihnen positiv bewertet werden herostwist Antwort blieb aber die Suche und wirklich, hier ist eine moderne Lösung, die das core-JavaScript (string.localeCompare Funktion)
Bis dahin, halten Sie Ausschau für eine vollständige Unterstützung für ALLE Plattformen und env.
Ist das alles ?
Nein, wir können weiter gehen, gerade jetzt, und verwenden Sie string.toLocaleLowerCase Funktion.
Danke !
InformationsquelleAutor der Antwort Salathiel Genèse
Ich denke, das ist die sauberste Lösung
Es 0 zurück wenn die zwei strings identisch sind, ignorieren Akzente.
Alternativ können Sie versuchen
localecompare
InformationsquelleAutor der Antwort user1221780
Erste, würde ich empfehlen, eine switch-Anweisung anstelle einer langen Reihe von if-else-if ...
Dann, ich bin nicht sicher, warum Sie nicht wie Ihre aktuelle Lösung. Es ist sicherlich die sauberste. Was meinst du mit " nicht berücksichtigt "alle Zeichen"?
Gibt es keine standard-Methode in JavaScript anzeigen akzentuierte Buchstaben, ASCII-Zeichen, die außerhalb der Verwendung einer Drittanbieter-Bibliothek, also die die du geschrieben hast ist so gut wie jede andere.
Auch, "ß" ich glaube, maps, "ss", nicht ein einziges "s". Und hüten Sie sich vor "ich" mit und ohne Punkt in der türkischen -- ich glaube, Sie beziehen sich auf verschiedene Buchstaben.
InformationsquelleAutor der Antwort Stephen Chung
Können Sie auch http://fusejs.io für fuzzy-Suche.
InformationsquelleAutor der Antwort yglodt