PehBehBeh

Erfahrungen eines Hobby-Webentwicklers

Exotische PHP-Funktionen: metaphone() und soundex()

| 5 Kommentare

In diesem Teil der Artikelserie “Exotische PHP-Funktionen” möchte ich euch gleich zwei Funktionen vorstellen, die mehr oder weniger das Gleiche bewirken: metaphone() und soundex(). Mit diesen Funktionen lassen sich Ähnlichkeiten von Strings überprüfen.


Anwendung

Beiden Funktionen wird als Parameter eine Zeichenkette übergeben, von der bei metaphone() der Metaphon-Schlüssel und bei soundex() der Soundex-Schlüssel als Zeichenkette zurückgegeben wird. Bei gleicher Aussprache wird der gleiche Wert zurückgegeben.

Laut PHP Manual arbeitet die metaphone()-Funktion genauer, da sie Grundregeln der englischen Aussprache kennt. Die Metaphon-Schlüssel sind zudem von variabler Länge. Soundex-Schlüssel hingegen bestehen immer aus vier Zeichen: ein Buchstabe gefolgt von drei Ziffern.

Beispiel

metaphone:

echo metaphone("train"); // TRN
echo metaphone("terrain"); // TRN
echo metaphone("not a train"); // NTTRN

soundex:

echo soundex("train"); // T650
echo soundex("terrain"); // T650
echo soundex("not a train"); // N336


Update 24.02.2010:
Um deutsche Wörter zu vergleichen, liefert der Algorithmus der Kölner Phonetik bessere Ergebnisse. Ich habe einen Artikel dazu veröffentlicht. (» zum Artikel)

Dir hat der Artikel gefallen?
Dann abonniere doch den RSS-Feed!
  • Geil, was es net alles gibt 🙂 Aber schöne Idee, mit den exotischen Funktionen 😉

    Grüße

  • Erstaunt mich auch immer wieder,
    dass man jeden Tag etwas Neues finden kann. 🙂

  • Hi Phil,

    habe ich zuletzt auch noch verwendet, um die Ähnlichkeit von zwei Passwörtern zu ermitteln.

    Wichtig wäre noch zu erwähnen, daß soundex() Schwächen im Bezug auf unsere deutsche Sprache hat und sich hier der Einsatz der „Kölner Phonetik“ anbietet. Eine Implementierung des Algorithmus findet man hier: http://www.php.net/manual/de/function.soundex.php#84881

    Aber Achtung ein kleiner Bug ist drin, dadurch nicht E_STRICT kompatibel:

    Statt
    for ($i=0;$i<$len;$i++){
    müsste es heißen
    for ($i=0;$i<$len-1;$i++){

    Grüße

  • Hey, damit hast du mir meinen heutigen Artikel vorweggenommen. 😉

    Aber du hast recht: Ich hätte es schon in diesem Artikel erwähnen sollen.

  • Das es so was überhaupt gibt, richtig nett, werde es aber wohl nie benutzten.