Moin hier! :)
Ok, ich werde es versuchen, 80% zu definieren, aber zuerst möchte ich die 80% doch besser auf 65% runtersetzen.
Irrelevant: Wenn du herausfindest, wieviel % des einen mit dem anderen String identisch sind, dann kannst du die Grenze selbst setzen.
Zwischenschritt: Die Variable RechenUmInProzent enthält die minimale Anzahl an Zeichen, die ersetzt, eingefügt oder gelöscht werden müssen um den String 1 nach String 2 umzusetzen.
Du willst also beliebige Variantionen des Strings erlauben: Zwischen jedem vorhandenen Zeichen können beliebig viele andere Zeichen stehen, jedes vorhandene Zeichen kann auch gelöscht werden, um Übereinstimmung zu erhalten.
Das ist eine äußerst komplexe Aufgabe!
Vielleicht klappts mit einem regulären Ausdruck.
Mal angenommen, du willst den String "defgh" auf Ähnlichkeit testen, dann sollte der zweite String ungefähr so aussehen:
/.*d?.*e?.*f?.*g?.*h?.*/
Vorher, dazwischen, und hinterher beliebig viele (auch kein) Zeichen (das bedeutet '.*'), und die vorhandenen Zeichen können, müssen aber nicht vorkommen (das bedeutet das Fragezeichen dahinter).
Wenn du die möglichen Ersetzungen feststellen willst, mußt du die einzelnen Bestandteile in Klammern setzen und auswerten:
/(.*)(d?)(.*)(e?)(.*)(f?)(.*)(g?)(.*)(h?)(.*)/
Und diesen Ausdruck vergleichst du dann mit dem zweiten String, und erhälst in den "passenden" Variablen die Information, ob kein oder mehrere Zeichengefunden wurden, die dazwischenpassen.
Du hast allerdings keinerlei Garantie, daß du ein Veränderungsminimum erhälst. Vielleicht findest du im Laufe der Tests heraus, daß es besser ist, den regulären Ausdruck nicht-gierig zu machen. Das sähe dann so aus:
/(.*?)(d?)(.*?)(e?)(.*?)(f?)(.*?)(g?)(.*?)(h?)(.*?)/
Letztendlich laufen alle regulären Ausdrücke aber auf eines hinaus: Du verwendest die regulären Ausdrücke von Javascript </selfhtml/javascript/objekte/regexp.htm>. Die Informationen der Klammern fragst du mit RegExp.$1 etc. ab und stellst so fest, ob im zweiten String Zeichen vorhanden waren, die im ersten nicht drinwaren (bei allen Klammern mit *.?), bzw. ob die geforderten Buchstaben enthalten waren (bei Klammern mit x?). Du hast übrigens Glück: Die erste Art von Klammern hat die ungeraden Zahlen, die zweite Art von Klammern die geraden Zahlen in der Ergebnisvariablen.
Ich fürchte nur, in Javascript ist nach neun Klammern Schluß, und bei Wörtern mit mehr als vier Buchstaben mußt du dir was anderes ausdenken.
Du kannst natürlich auch nachforschen, ob es irgendwo einen Ähnlichkeitsalgorithmus gibt, der Strings auf die von dir gewünschte Weise vergleicht und ein Ergebnis auswirft.
Vielleicht solltest du aber doch nicht mit Javascript zu Werke gehen, sondern mit PHP. Das kennt nämlich viele passende Funktionen, um Strings auf Ähnlichkeit zu vergleichen. Unter anderem passen die Funktionen "levenshtein" und "similar_text", welche vermutlich genau das tun, was du willst. Darüber hinaus gibts noch die Funktionen "soundex" und "metaphone", welche Identitäten über die Aussprache feststellen können.
http://www.selfphp.info/funktionsreferenz/string_funktionen/levenshtein.php
- Sven Rautenberg