online 1
gast (50)

/ Forum / Skripte(PHP,ASP,Perl...)

Skripte(PHP,ASP,Perl...)Skripte(PHP,ASP,Perl...)

Fragevon Uesch vom 01.07.2019, 00:48 Options

"Ähnlichstes" Wort raussuchen

Hallo allerseits,

ich möchte, dass wenn jemand ein Wort eingibt, das nicht in der Datenbank existiert, angezeigt wird, welches Wort am ehesten dem entspricht, das man eingegeben hat.

Dazu habe ich folgendes Script:
$sqll = "SELECT deutsch FROM words";
$resultt = mysql_query ($sqll);  
 while($row = mysql_fetch_array($resultt)){
// eingegebenes falsch geschriebenes Wort
$input = $search;

// Wörterarray als Vergleichsquelle
$words  = array($row["deutsch"]);
// noch keine kürzeste Distanz gefunden
$shortest = -1;

// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {

   // berechne die distanz zwischen Inputwort und aktuellem Wort
   $lev = levenshtein($input, $word);

   // auf einen exakten Treffer prüfen
   if ($lev == 0) {

       // das nächste Wort ist das Wort selbst (exakter Treffer)
       $closest = $word;
       $shortest = 0;

       // Schleife beenden, da wir einen exakten Treffer gefunden haben
       break;
   }

   // Wenn die Distanz kleiner ist als die nächste gefundene kleinste Distanz
   // ODER wenn ein nächstkleineres Wort noch nicht gefunden wurde
   if ($lev <= $shortest || $shortest < 0) {
       // setze den nächstliegenden Treffer und die kürzestes Distanz
       $closest  = $word;
       $shortest = $lev;
   }
}}

echo "Eingegebenes Wort: $input\n";
if ($shortest == 0) {
   echo "Exakter Treffer gefunden: $closest\n";
} else {
   echo "Meinten Sie: $closest?\n";
}


Ich glaube allerdings, dass der Teil am Anfang, wo $words = array($row["deutsch"]) steht, falsch ist. Auf jeden Fall bekomme ich - egal was ich im Textfeld eingebe - immer die gleiche Meldung: Meinten Sie "Hut"? Es ist völlig egal, was ich eingebe, es erscheint immer diese Meldung!

Was mache ich falsch?


Antwort schreiben

Antwort 1 von Supermax vom 01.07.2019, 08:43 Options

richtig wäre es so:


$words = array();
while($row = mysql_fetch_array($resultt)) {
   array_push($words,$row["deutsch"]);
}
mysql_free_result($resultt);
$shortest = -1;

// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {
...


Der Rest des Codes dann wie gehabt, nur die schließende Klammer am Schluß muß noch weg (die mysql_fetch_array()-Schleife wird ja bereits oben abgeschlossen).

Erklärung:

durch
$words = array($row["deutsch"]);
erzeugst du immer ein Array mit nur einem Element, nämlich dem zuletzt aus der DB gelesenen Wort. Mit
array_push()
wird stattdessen immer das aktuelle Wort an das Array angehängt.

Antwort 2 von Uesch vom 01.07.2019, 13:49 Options

Danke erstmal,

so müsste es doch jetzt stimmen, oder? Er zeigt nämlich trotzdem nur das letzte Wort an:


$sqll = "SELECT deutsch FROM words";
$resultt = mysql_query ($sqll); 
$words = array();
while($row = mysql_fetch_array($resultt)) {
array_push($words,$row["deutsch"]);
}
mysql_free_result($resultt);
$shortest = -1;

// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {

   // berechne die distanz zwischen Inputwort und aktuellem Wort
   $lev = levenshtein($input, $word);

   // auf einen exakten Treffer prüfen
   if ($lev == 0) {

       // das nächste Wort ist das Wort selbst (exakter Treffer)
       $closest = $word;
       $shortest = 0;

       // Schleife beenden, da wir einen exakten Treffer gefunden haben
       break;
   }

   // Wenn die Distanz kleiner ist als die nächste gefundene kleinste Distanz
   // ODER wenn ein nächstkleineres Wort noch nicht gefunden wurde
   if ($lev <= $shortest || $shortest < 0) {
       // setze den nächstliegenden Treffer und die kürzestes Distanz
       $closest  = $word;
       $shortest = $lev;
   }
}

if ($shortest != 0) {
echo "<br><br>Meinten Sie: <a href=\"http://www.tierbild.net/lexikon/index.php?search=$closest&button=%3E%3E+Suche\">$closest</a>?";}

}

Antwort 3 von Supermax vom 01.07.2019, 13:57 Options

Wo kommt denn das $search her? Wenn du eine neuere PHP-Version verwendest (>= 4.3), ist die Option register_globals meistens deaktiviert, d.h. du kannst auf per POST oder GET übergebene Variablen nur mit $_POST[] bzw. $_GET[] zugreifen.

Wenn $search also aus einem FORM mit method="get" kommt, mußt du
$input = $_GET['search'];
schreiben.

Du solltest dir generell angewöhnen, nur noch $_SESSION, $_GET und $_POST für den Zugriff auf Session- und Formulardaten zu verwenden, da die Verwendung von register_globals große Sicherheitslücken in deinem Programm aufreißen kann und bei den meisten Server inzwischen ohnehin standardmäßig deaktiviert ist.

Antwort 4 von Uesch vom 01.07.2019, 14:09 Options

Perfekt, danke! Klappt jetzt!

Ähnliche Themen

Word Wörterbuch ändern
Rosmarin  02.02.2007 - 245 Hits -

My SQL
Uesch  06.10.2007 - 74 Hits - 24 Antworten

suchen und ersetzen bestimmtes wort
ponscho  07.08.2007 - 53 Hits - 2 Antworten

Zelleneinträge vergleichen
Uwe2  02.10.2007 - 90 Hits - 5 Antworten

zuordnungen
wundi123  30.04.2008 - 64 Hits - 6 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026