135 Stimmen

Alle akzentuierten Zeichen in einer Zeichenkette effizient ersetzen?

Für die Umsetzung eines armen Mannes von in der Nähe von -korrekte Sortierung auf der Client-Seite Ich brauche eine JavaScript-Funktion, die effizient Ersetzung einzelner Zeichen in einer Zeichenkette.

Hier ist, was ich meine (beachten Sie, dass dies für den deutschen Text gilt, andere Sprachen sortieren anders):

native sorting gets it wrong: a b c o u z ä ö ü
collation-correct would be:   a ä b c o ö u ü z

Im Grunde muss ich alle Vorkommen von "ä" in einer gegebenen Zeichenkette durch "a" (und so weiter) ersetzen. Auf diese Weise würde das Ergebnis der nativen Sortierung sehr nahe an dem liegen, was ein Benutzer erwarten würde (oder was eine Datenbank zurückgeben würde).

In anderen Sprachen ist dies möglich: Python-Lieferungen str.translate() , in Perl gibt es tr/…/…/ , XPath hat eine Funktion translate() , ColdFusion hat ReplaceList() . Aber was ist mit JavaScript?

Hier ist, was ich im Moment habe.

// 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]; 
  }) );
}

Zunächst einmal gefällt mir nicht, dass die Regex bei jedem Funktionsaufruf neu aufgebaut wird. Ich schätze, dass eine Schließung in dieser Hinsicht helfen kann, aber ich scheine aus irgendeinem Grund nicht den Dreh raus zu haben.

Fällt jemandem etwas Effizienteres ein?


Die folgenden Antworten fallen in zwei Kategorien:

  1. Funktionen zur Ersetzung von Zeichenketten mit unterschiedlichem Grad an Vollständigkeit und Effizienz (worum ich ursprünglich gebeten hatte)
  2. A späte Erwähnung von String#localeCompare die jetzt weitgehend unterstützt unter den JS-Engines (nicht so sehr zum Zeitpunkt der Frage) und könnte diese Art von Problem viel eleganter lösen.

12 Stimmen

Sie liegen falsch mit Ihrer Annahme, dass ein Benutzer erwartet, dass "ä" mit "a" sortiert wird. Das schwedische Alphabet hat 29 Buchstaben: abcdefghijklmnopqrstuvwxyzåäö und das dänische/norwegische auch: abcdefghijklmnopqrstuvwxyzæøå. Die erwartete Reihenfolge ist: "Apelsin", "Banan", "Äpple".

1 Stimmen

Ich weiß. Die Lösung war für die Sortierung deutscher Texte gedacht. Auch dort ist sie nicht richtig aber gut genug für den Anwendungsfall. Diese Frage war nie als Suche nach dem "löst alle Probleme"-Algorithmus gedacht.

1 Stimmen

Ich habe die Frage ein wenig umformuliert, um das von Anfang an klar zu machen.

127voto

Ed. Punkte 1931

Hier ist eine vollständigere Version auf der Grundlage des Unicode-Standards.

var Latinise={};Latinise.latin_map={"Á":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"Â":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"Ä":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"À":"A",
"":"A",
"":"A",
"":"A",
"":"A",
"Å":"A",
"":"A",
"":"A",
"":"A",
"Ã":"A",
"":"AA",
"Æ":"AE",
"":"AE",
"":"AE",
"":"AO",
"":"AU",
"":"AV",
"":"AV",
"":"AY",
"":"B",
"":"B",
"":"B",
"":"B",
"":"B",
"":"B",
"":"C",
"":"C",
"Ç":"C",
"":"C",
"":"C",
"":"C",
"":"C",
"":"C",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"D",
"":"DZ",
"":"DZ",
"É":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"Ê":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"Ë":"E",
"":"E",
"":"E",
"":"E",
"È":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"E",
"":"ET",
"":"F",
"":"F",
"":"G",
"":"G",
"":"G",
"":"G",
"":"G",
"":"G",
"":"G",
"":"G",
"":"G",
"":"H",
"":"H",
"":"H",
"":"H",
"":"H",
"":"H",
"":"H",
"":"H",
"":"H",
"Í":"I",
"":"I",
"":"I",
"Î":"I",
"Ï":"I",
"":"I",
"":"I",
"":"I",
"":"I",
"Ì":"I",
"":"I",
"":"I",
"":"I",
"":"I",
"":"I",
"":"I",
"":"I",
"":"D",
"":"F",
"":"G",
"":"R",
"":"S",
"":"T",
"":"IS",
"":"J",
"":"J",
"":"K",
"":"K",
"":"K",
"":"K",
"":"K",
"":"K",
"":"K",
"":"K",
"":"K",
"":"K",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"L",
"":"LJ",
"":"M",
"":"M",
"":"M",
"":"M",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"":"N",
"Ñ":"N",
"":"NJ",
"Ó":"O",
"":"O",
"":"O",
"Ô":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"Ö":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"Ò":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"":"O",
"Ø":"O",
"":"O",
"Õ":"O",
"":"O",
"":"O",
"":"O",
"":"OI",
"":"OO",
"":"E",
"":"O",
"":"OU",
"":"P",
"":"P",
"":"P",
"":"P",
"":"P",
"":"P",
"":"P",
"":"Q",
"":"Q",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"R",
"":"C",
"":"E",
"":"S",
"":"S",
"Š":"S",
"":"S",
"":"S",
"":"S",
"":"S",
"":"S",
"":"S",
"":"S",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"T",
"":"A",
"":"L",
"":"M",
"":"V",
"":"TZ",
"Ú":"U",
"":"U",
"":"U",
"Û":"",
"":"U",
"Ü":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"Ù":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"U",
"":"V",
"":"V",
"":"V",
"":"V",
"":"VY",
"":"W",
"":"W",
"":"W",
"":"W",
"":"W",
"":"W",
"":"W",
"":"X",
"":"X",
"Ý":"Y",
"":"Y",
"Ÿ":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Y",
"":"Z",
"Ž":"Z",
"":"Z",
"":"Z",
"":"Z",
"":"Z",
"":"Z",
"":"Z",
"":"Z",
"":"IJ",
"Œ":"OE",
"":"A",
"":"AE",
"":"B",
"":"B",
"":"C",
"":"D",
"":"E",
"":"F",
"":"G",
"":"G",
"":"H",
"":"I",
"":"R",
"":"J",
"":"K",
"":"L",
"":"L",
"":"M",
"":"N",
"":"O",
"":"OE",
"":"O",
"":"OU",
"":"P",
"":"R",
"":"N",
"":"R",
"":"S",
"":"T",
"":"E",
"":"R",
"":"U",
"":"V",
"":"W",
"":"Y",
"":"Z",
"á":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"â":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"ä":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"à":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"":"a",
"å":"a",
"":"a",
"":"a",
"":"a",
"ã":"a",
"":"aa",
"æ":"ae",
"":"ae",
"":"ae",
"":"ao",
"":"au",
"":"av",
"":"av",
"":"ay",
"":"b",
"":"b",
"":"b",
"":"b",
"":"b",
"":"b",
"":"b",
"":"b",
"":"o",
"":"c",
"":"c",
"ç":"c",
"":"c",
"":"c",
"":"c",
"":"c",
"":"c",
"":"c",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"d",
"":"i",
"":"j",
"":"j",
"":"j",
"":"dz",
"":"dz",
"é":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"ê":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"ë":"e",
"":"e",
"":"e",
"":"e",
"è":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"e",
"":"et",
"":"f",
"ƒ":"f",
"":"f",
"":"f",
"":"g",
"":"g",
"":"g",
"":"g",
"":"g",
"":"g",
"":"g",
"":"g",
"":"g",
"":"g",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"h",
"":"hv",
"í":"i",
"":"i",
"":"i",
"î":"i",
"ï":"i",
"":"i",
"":"i",
"":"i",
"ì":"i",
"":"i",
"":"i",
"":"i",
"":"i",
"":"i",
"":"i",
"":"i",
"":"i",
"":"d",
"":"f",
"":"g",
"":"r",
"":"s",
"":"t",
"":"is",
"":"j",
"":"j",
"":"j",
"":"j",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"k",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"l",
"":"lj",
"":"s",
"":"s",
"":"s",
"":"s",
"":"m",
"":"m",
"":"m",
"":"m",
"":"m",
"":"m",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"":"n",
"ñ":"n",
"":"nj",
"ó":"o",
"":"o",
"":"o",
"ô":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"ö":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"ò":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"":"o",
"ø":"o",
"":"o",
"õ":"o",
"":"o",
"":"o",
"":"o",
"":"oi",
"":"oo",
"":"e",
"":"e",
"":"o",
"":"o",
"":"ou",
"":"p",
"":"p",
"":"p",
"":"p",
"":"p",
"":"p",
"":"p",
"":"p",
"":"p",
"":"q",
"":"q",
"":"q",
"":"q",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"r",
"":"c",
"":"c",
"":"e",
"":"r",
"":"s",
"":"s",
"š":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"s",
"":"g",
"":"o",
"":"o",
"":"u",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"t",
"":"th",
"":"a",
"":"ae",
"":"e",
"":"g",
"":"h",
"":"h",
"":"h",
"":"i",
"":"k",
"":"l",
"":"m",
"":"m",
"":"oe",
"":"r",
"":"r",
"":"r",
"":"r",
"":"t",
"":"v",
"":"w",
"":"y",
"":"tz",
"ú":"u",
"":"u",
"":"u",
"û":"u",
"":"u",
"ü":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"ù":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"u",
"":"ue",
"":"um",
"":"v",
"":"v",
"":"v",
"":"v",
"":"v",
"":"v",
"":"v",
"":"vy",
"":"w",
"":"w",
"":"w",
"":"w",
"":"w",
"":"w",
"":"w",
"":"w",
"":"x",
"":"x",
"":"x",
"ý":"y",
"":"y",
"ÿ":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"y",
"":"z",
"ž":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"z",
"":"ff",
"":"ffi",
"":"ffl",
"":"fi",
"":"fl",
"":"ij",
"œ":"oe",
"":"st",
"":"a",
"":"e",
"":"i",
"":"j",
"":"o",
"":"r",
"":"u",
"":"v",
"":"x"};
String.prototype.latinise=function(){return this.replace(/[^A-Za-z0-9\[\] ]/g,function(a){return Latinise.latin_map[a]||a})};
String.prototype.latinize=String.prototype.latinise;
String.prototype.isLatin=function(){return this==this.latinise()}

Einige Beispiele:

> "Piqué".latinize();
"Pique"
> "Piqué".isLatin();
false
> "Pique"isLatin();
true
> "Piqué".latinise().isLatin();
true

1 Stimmen

Danke, das ist sehr hilfreich. Es gibt noch Raum für Optimierungen, aber es ist ein guter Anfang. +1

2 Stimmen

Was ist der Sinn dieser Zeile? String.prototype.latinize=String.prototype.latinise; ?

0 Stimmen

@zsitro Diese Zeile ermöglicht den Aufruf der Funktion über "äöü".latinize() y "äöü".latinise() . Keine gute Praxis!!

46voto

Revadike Punkte 456

https://stackoverflow.com/a/37511463

Mit ES2015/ES6 String.Prototype.Normalize() ,

const str = "Crème Brulée"
str.normalize('NFD').replace(/[\u0300-\u036f]/g, "")
> 'Creme Brulee'

Hier geschehen zwei Dinge:

  1. normalize() in Bezug auf NFD Die Unicode-Normalform zerlegt kombinierte Grapheme in die Kombination von einfachen Graphemen. Die è de Crème wird am Ende ausgedrückt als e + .
  2. Verwendung einer Regex Charakterklasse den Bereich U+0300 U+036F anzupassen, ist es nun trivial, die g die diakritischen Zeichen, die im Unicode-Standard praktischerweise als Kombinierte diakritische Zeichen Unicode-Block.

Siehe Kommentar zu den Leistungstests.

Wenn Sie nur sortieren wollen, können Sie auch

Intl. Kollator genügend Unterstützung hat ~85% im Moment ist auch ein Polyfill verfügbar aquí aber ich habe es nicht getestet.

const c = new Intl.Collator();
['creme brulee', 'crème brulée', 'crame brulai', 'crome brouillé',
'creme brulay', 'creme brulfé', 'creme bruléa'].sort(c.compare)
[ 'crame brulai','creme brulay','creme bruléa','creme brulee',
'crème brulée','creme brulfé','crome brouillé' ]

['creme brulee', 'crème brulée', 'crame brulai', 'crome brouillé'].sort((a,b) => a>b)
["crame brulai", "creme brulee", "crome brouillé", "crème brulée"]

2 Stimmen

Ich halte diese Antwort für die beste. Sie basiert auf dem Unicode-Standard und verwendet eingebaute Funktionen. Danke!

0 Stimmen

Intl.Collator(undefined , {sensitivity: 'base'})

0 Stimmen

Ich benutzte dies für die Erstellung eines Slug, so dass, bevor ich Leerzeichen zu hinteren Schrägstrich und alles zu Kleinbuchstaben ersetzen. Ihre Funktion funktioniert perfekt!!!

43voto

Jason Bunting Punkte 56534

Ich kann nicht sagen, was Sie versuchen, speziell mit der Funktion selbst zu tun, aber wenn Sie nicht wie die Regex wird jedes Mal gebaut, hier sind zwei Lösungen und einige Vorbehalte über jede.

Hier ist eine Möglichkeit, dies zu tun:

function makeSortString(s) {
  if(!makeSortString.translate_re) makeSortString.translate_re = /[öäüÖÄÜ]/g;
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  return ( s.replace(makeSortString.translate_re, function(match) { 
    return translate[match]; 
  }) );
}

Dadurch wird die Regex offensichtlich zu einer Eigenschaft der Funktion selbst. Das Einzige, was Ihnen daran vielleicht nicht gefällt (oder vielleicht doch, es kommt darauf an), ist, dass die Regex nun außerhalb des Funktionskörpers geändert werden kann. Jemand könnte dies also tun, um die intern verwendete Regex zu ändern:

makeSortString.translate_re = /[a-z]/g;

Es gibt also diese Möglichkeit.

Eine Möglichkeit, eine Schließung zu erhalten und so zu verhindern, dass jemand die Regex ändert, wäre, dies als anonyme Funktionszuweisung wie diese zu definieren:

var makeSortString = (function() {
  var translate_re = /[öäüÖÄÜ]/g;
  return function(s) {
    var translate = {
      "ä": "a", "ö": "o", "ü": "u",
      "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
    };
    return ( s.replace(translate_re, function(match) { 
      return translate[match]; 
    }) );
  }
})();

Ich hoffe, dass dies für Sie nützlich ist.


UPDATE: Es ist noch früh, und ich weiß nicht, warum ich das Offensichtliche nicht schon früher erkannt habe, aber es könnte auch nützlich sein, Ihnen die translate Objekt auch in einem Abschluss:

var makeSortString = (function() {
  var translate_re = /[öäüÖÄÜ]/g;
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  return function(s) {
    return ( s.replace(translate_re, function(match) { 
      return translate[match]; 
    }) );
  }
})();

1 Stimmen

Ich versuche, die Sortierung des jQuery Tablesorter-Plugins für deutschsprachige Tabellendaten korrekt zu machen. Das Plugin kann eine benutzerdefinierte Funktion nehmen, um die Zeichenfolge zu extrahieren, um zu sortieren, das ist, was ich zu tun haben, oder die resultierende Sortierreihenfolge falsch sein wird.

0 Stimmen

Ist diese Funktion wirklich so ineffizient? Was haben Sie in Bezug auf die Tests getan?

1 Stimmen

Ich wollte damit nicht sagen, dass meine Umsetzung ineffizient war. Es ist so ziemlich die effizienteste Methode, die mir einfällt. Aber ich kann nicht an alles denken, also hoffte ich, dass es eine wirklich clevere Art der Stringmanipulation gibt, die mir nicht bekannt ist.

40voto

Jeroen Ooms Punkte 30332

Die korrekte Terminologie für solche Akzente lautet Diakritische Zeichen . Nachdem ich diesen Begriff gegoogelt hatte, fand ich diese Funktion die Teil von backbone.paginator . Es verfügt über eine sehr vollständige Sammlung von diakritischen Zeichen und ersetzt sie durch ihre intuitivsten ASCII-Zeichen. Ich habe festgestellt, dass dies die vollständigste Javascript-Lösung ist, die heute verfügbar ist.

Die vollständige Funktion zur späteren Verwendung:

function removeDiacritics (str) {

  var defaultDiacriticsRemovalMap = [
    {'base':'A', 'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},
    {'base':'AA','letters':/[\uA732]/g},
    {'base':'AE','letters':/[\u00C6\u01FC\u01E2]/g},
    {'base':'AO','letters':/[\uA734]/g},
    {'base':'AU','letters':/[\uA736]/g},
    {'base':'AV','letters':/[\uA738\uA73A]/g},
    {'base':'AY','letters':/[\uA73C]/g},
    {'base':'B', 'letters':/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},
    {'base':'C', 'letters':/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},
    {'base':'D', 'letters':/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},
    {'base':'DZ','letters':/[\u01F1\u01C4]/g},
    {'base':'Dz','letters':/[\u01F2\u01C5]/g},
    {'base':'E', 'letters':/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},
    {'base':'F', 'letters':/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},
    {'base':'G', 'letters':/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},
    {'base':'H', 'letters':/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},
    {'base':'I', 'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},
    {'base':'J', 'letters':/[\u004A\u24BF\uFF2A\u0134\u0248]/g},
    {'base':'K', 'letters':/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},
    {'base':'L', 'letters':/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},
    {'base':'LJ','letters':/[\u01C7]/g},
    {'base':'Lj','letters':/[\u01C8]/g},
    {'base':'M', 'letters':/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},
    {'base':'N', 'letters':/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},
    {'base':'NJ','letters':/[\u01CA]/g},
    {'base':'Nj','letters':/[\u01CB]/g},
    {'base':'O', 'letters':/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},
    {'base':'OI','letters':/[\u01A2]/g},
    {'base':'OO','letters':/[\uA74E]/g},
    {'base':'OU','letters':/[\u0222]/g},
    {'base':'P', 'letters':/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},
    {'base':'Q', 'letters':/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},
    {'base':'R', 'letters':/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},
    {'base':'S', 'letters':/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},
    {'base':'T', 'letters':/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},
    {'base':'TZ','letters':/[\uA728]/g},
    {'base':'U', 'letters':/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},
    {'base':'V', 'letters':/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},
    {'base':'VY','letters':/[\uA760]/g},
    {'base':'W', 'letters':/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},
    {'base':'X', 'letters':/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},
    {'base':'Y', 'letters':/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},
    {'base':'Z', 'letters':/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},
    {'base':'a', 'letters':/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},
    {'base':'aa','letters':/[\uA733]/g},
    {'base':'ae','letters':/[\u00E6\u01FD\u01E3]/g},
    {'base':'ao','letters':/[\uA735]/g},
    {'base':'au','letters':/[\uA737]/g},
    {'base':'av','letters':/[\uA739\uA73B]/g},
    {'base':'ay','letters':/[\uA73D]/g},
    {'base':'b', 'letters':/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},
    {'base':'c', 'letters':/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},
    {'base':'d', 'letters':/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},
    {'base':'dz','letters':/[\u01F3\u01C6]/g},
    {'base':'e', 'letters':/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},
    {'base':'f', 'letters':/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},
    {'base':'g', 'letters':/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},
    {'base':'h', 'letters':/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},
    {'base':'hv','letters':/[\u0195]/g},
    {'base':'i', 'letters':/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},
    {'base':'j', 'letters':/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},
    {'base':'k', 'letters':/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},
    {'base':'l', 'letters':/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},
    {'base':'lj','letters':/[\u01C9]/g},
    {'base':'m', 'letters':/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},
    {'base':'n', 'letters':/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},
    {'base':'nj','letters':/[\u01CC]/g},
    {'base':'o', 'letters':/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},
    {'base':'oi','letters':/[\u01A3]/g},
    {'base':'ou','letters':/[\u0223]/g},
    {'base':'oo','letters':/[\uA74F]/g},
    {'base':'p','letters':/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},
    {'base':'q','letters':/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},
    {'base':'r','letters':/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},
    {'base':'s','letters':/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},
    {'base':'t','letters':/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},
    {'base':'tz','letters':/[\uA729]/g},
    {'base':'u','letters':/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},
    {'base':'v','letters':/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},
    {'base':'vy','letters':/[\uA761]/g},
    {'base':'w','letters':/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},
    {'base':'x','letters':/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},
    {'base':'y','letters':/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},
    {'base':'z','letters':/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}
  ];

  for(var i=0; i<defaultDiacriticsRemovalMap.length; i++) {
    str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);
  }

  return str;

}

1 Stimmen

Sieht sehr gut aus. - Leider gab es backbone.js noch nicht, als diese Frage geschrieben wurde :)

1 Stimmen

Weitere Diskussionen über diese Lösung auf stackoverflow.com/a/18391901/759452

23voto

atiruz Punkte 2612

Es sollte einfach eine normalisierte Kette und ein Ersatzcode ausgeführt werden:

var str = "Letras Á É Í Ó Ú Ñ - á é í ó ú ñ...";
console.log (str.normalize ("NFKD").replace (/[\u0300-\u036F]/g, ""));
// Letras A E I O U N - a e i o u n...

Siehe normalisieren

Dann können Sie diese Funktion verwenden:

function noTilde (s) {
    if (s.normalize != undefined) {
        s = s.normalize ("NFKD");
    }
    return s.replace (/[\u0300-\u036F]/g, "");
}

1 Stimmen

Das ist sehr schön! Der Nachteil ist jedoch, dass es zum Zeitpunkt der Erstellung dieses Artikels noch nicht ausgereift und kaum portabel ist.

0 Stimmen

Kann in einer Funktion gekapselt werden

0 Stimmen

Alle Kapselungen sind nutzlos, wenn die JS-Engine im Browser diese Funktion nicht unterstützt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X