soundex()
Unser Artikel behandelt die PHP-Funktion soundex(), die den Soundex-Schlüssel eines Strings berechnet und für den phonetischen Namensvergleich nützlich ist.
Die PHP-Funktion soundex() berechnet den Soundex-Schlüssel eines Strings — einen kurzen Code, der beschreibt, wie der String auf Englisch klingt, anstatt wie er geschrieben wird. Zwei Wörter, die unterschiedlich geschrieben, aber ähnlich ausgesprochen werden (z. B. „Smith" und „Smyth"), erzeugen denselben Schlüssel. Das macht Soundex nützlich für unscharfe Namenssuche, Rechtschreibvorschläge und die Deduplizierung von Kontaktlisten.
Diese Seite behandelt die Syntax von soundex(), das Format des zurückgegebenen Schlüssels, die Funktionsweise des Algorithmus und praktische Beispiele — einschließlich seiner Einschränkungen und eines Vergleichs mit verwandten Funktionen.
Syntax
soundex(string $string): stringDie Funktion nimmt einen Parameter entgegen:
$string— der zu codierende Eingabe-String. Nur alphabetische Zeichen werden berücksichtigt; Ziffern, Leerzeichen und Satzzeichen werden ignoriert.
Sie gibt den Soundex-Schlüssel als String zurück. Bei nicht leerem alphabetischem Eingabewert besteht der Schlüssel stets aus 4 Zeichen: einem Großbuchstaben gefolgt von drei Ziffern (z. B. H464). Enthält die Eingabe keine Buchstaben, gibt soundex() einen leeren String zurück.
Aufbau des Soundex-Schlüssels
Der Soundex-Algorithmus reduziert ein Wort auf seinen ersten Buchstaben plus einen dreistelligen Code, der auf den verbleibenden Konsonantenklängen basiert:
-
Der erste Buchstabe des Wortes wird beibehalten.
-
Die verbleibenden Buchstaben werden Ziffern zugeordnet, wobei ähnlich klingende Konsonanten gruppiert werden:
Buchstaben Ziffer b, f, p, v 1 c, g, j, k, q, s, x, z 2 d, t 3 l 4 m, n 5 r 6 -
Die Vokale
a, e, i, o, usowie die Buchstabenh, w, ywerden weggelassen (ihnen wird keine Ziffer zugewiesen). -
Aufeinanderfolgende doppelte Ziffern werden zu einer zusammengefasst.
-
Das Ergebnis wird mit Nullen aufgefüllt (oder abgeschnitten) auf genau vier Zeichen.
Deshalb erzeugen sowohl soundex('Robert') als auch soundex('Rupert') den Schlüssel R163 — die unterschiedlichen Vokale werden ignoriert.
Einfaches Beispiel
Hier wird der String $string mit soundex() codiert. Die Ausgabe lautet:
H464Das H ist der erste Buchstabe, und 464 codiert die Konsonantenklänge l (4), r (6), l (4). Das Leerzeichen und die Wortgrenze werden ignoriert — Soundex behandelt die Eingabe als eine zusammenhängende Buchstabenfolge.
Zwei Strings vergleichen
Der häufigste Einsatz von soundex() besteht darin, zu prüfen, ob zwei Wörter gleich klingen, indem ihre Schlüssel verglichen werden:
Da Smith und Smyth beide zu S530 codiert werden, stimmen ihre Schlüssel überein und die Ausgabe lautet:
The strings sound the same.Einen Namen gegen eine Liste abgleichen
Ein praktisches Muster besteht darin, „Meinten Sie…"-Vorschläge aus einer bekannten Liste zu machen, wenn keine exakte Übereinstimmung gefunden wird:
<?php
$names = ['Robert', 'Rupert', 'Rubin', 'Albert'];
$query = 'Ruppert';
$queryKey = soundex($query);
foreach ($names as $name) {
if (soundex($name) === $queryKey) {
echo "$name sounds like $query\n";
}
}
?>Sowohl Robert als auch Rupert teilen den Schlüssel R163 mit Ruppert, daher lautet die Ausgabe:
Robert sounds like Ruppert
Rupert sounds like RuppertEinschränkungen
- Englischzentriert. Die Buchstaben-zu-Ziffer-Zuordnung ist auf englische Aussprache ausgerichtet, daher funktioniert sie bei Namen aus anderen Sprachen schlecht.
- Erster Buchstabe muss übereinstimmen. Da Soundex immer den ersten Buchstaben beibehält, stimmen
Kris(K620) undChris(C620) nicht überein, obwohl sie gleich klingen. - Grobe Übereinstimmung. Nur die ersten wenigen Konsonantenklänge bleiben erhalten, sodass sehr unterschiedliche lange Wörter auf denselben Schlüssel fallen können. Verwenden Sie die Funktion als Vorfilter, nicht als endgültiges Ergebnis.
Für einen anderen phonetischen Algorithmus, der Englisch häufig besser verarbeitet, siehe metaphone(). Um zu messen, wie ähnlich zwei Strings sind, anstatt ob sie gleich klingen, siehe similar-text() und levenshtein().