Hi @ll,
hier mal etwas, das ich in den unendlichen Weiten des Internets so nicht direkt finden konnte: Wie man mit PHP die Lautähnlichkeit von zwei Strings herausfinden kann. Die Idee dahinter stammt nicht von mir, sondern von einem Kommentar auf php.net, den Code habe ich allerdings selbst gebaut.
Code und Ablauf:
Man soll hier ja auch was lernen, nicht?
<?php
/**
* Returns the acoustical distance of two strings
*
* Returns the percentage of sound difference of two
* strings.
* ATTENTION!: Returns either boolean false or number 0
* that can be interpreted as boolean false. Check for
* two existing strings always with
* if (getSoundDist($str1, $str2) !== false)
*
* @param string $str1
* @param string $str2
* @return boolean/float $distance
*/
function getSoundDist($str1, $str2) {
if (!isset($str1, $str2)) // Wenn einer der beiden Strings nicht vorhanden ist.
return false; // bool(false) wiedergeben. Stringlänge 0 (null) ist erlaubt!
if ($str1 == $str2) // Wenn die Strings gleich sind
return 0; // Null zurückgeben. Sie unterscheiden sich zu 0%
if (strlen($str1) == 0 OR strlen($str2) == 0) // Wenn einer der Strings Länge null hat
return 1; // Eins zurückgeben. Sie unterscheiden sich zu 100%
// Metaphone (MP) Schlüssel berechnen (Quasi PHP Lautmalerei)
// Nimmt die englische Aussprache als Grundlage!
$mp_str1 = metaphone($str1);
$mp_str2 = metaphone($str2);
$len = strlen($mp_str1);
return (levenshtein($mp_str1, $mp_str2) / $len); // Prozent (in Dezimal) der MP-String Distanz
// Levenshtein-Distanz. Wikipedia fragen.
}
?>
Alles anzeigen
Wofür ist das gut?
Wenn man zB ein Verzeichnis mit CD Titeln führt, kann man mit dieser Funktion prüfen, ob der Titel bereits ähnlich geschrieben im Verzeichnis ist. Man holt sich die Titel aus der Tabelle, führt die Funktion durch und gibt zB alle Titel aus, für die der Wert die 0.2 nicht überschreitet, dh, wo der Unterschied in der (eng.) Aussprache max. bei 20% liegt.
Kleiner Performancetipp für dieses Beispiel: Wenn man die Metaphonekeys gleich mit ins Verzeichnis setzt, muss man sie nicht erst generieren, geht dann schneller.
Ich habe die Funktion immer noch nicht aktiv testen können (mir fehlt die Grundlage), wäre schon, wenn das jemand machen und Feedback geben könnte!
Aktualisierungen:
06.03.14: Ich hab gemerkt, dass auch String 2 Länge null haben kann, deshalb habe ich die Funktion ein wenig verändert.
24.04.14: Ich habe versehentlich bei einem leeren String 0 ausgegeben. Da muss natürlich 1 ausgegeben werden. Außerdem den Code auskommentiert und dafür die ellenlange Beschreibung gelöscht.