W3docs

soundex()

Articolo sulla funzione PHP soundex(), che calcola la chiave Soundex di una stringa, utile per confrontare la pronuncia di parole simili.

La funzione PHP soundex() calcola la chiave Soundex di una stringa — un breve codice che rappresenta come la stringa suona in inglese piuttosto che come si scrive. Due parole con ortografia diversa ma pronuncia simile (come "Smith" e "Smyth") producono la stessa chiave, il che rende Soundex utile per la ricerca fuzzy di nomi, suggerimenti ortografici e deduplicazione di elenchi di contatti.

Questa pagina tratta la sintassi di soundex(), il formato della chiave restituita, il funzionamento dell'algoritmo e esempi pratici — incluse le sue limitazioni e il confronto con funzioni correlate.

Sintassi

soundex(string $string): string

Accetta un parametro:

  • $string — la stringa di input da codificare. Vengono considerati solo i caratteri alfabetici; cifre, spazi e punteggiatura vengono ignorati.

Restituisce la chiave Soundex come stringa. Per input alfabetici non vuoti la chiave è sempre di 4 caratteri: una lettera maiuscola seguita da tre cifre (ad esempio, H464). Se l'input non contiene lettere, soundex() restituisce una stringa vuota.

Come viene costruita la chiave Soundex

L'algoritmo Soundex riduce una parola alla sua prima lettera più un codice a tre cifre basato sui suoni consonantici rimanenti:

  1. Si mantiene la prima lettera della parola.

  2. Si mappano le lettere rimanenti su cifre, raggruppando le consonanti con suoni simili:

    LettereCifra
    b, f, p, v1
    c, g, j, k, q, s, x, z2
    d, t3
    l4
    m, n5
    r6
  3. Le vocali a, e, i, o, u e le lettere h, w, y vengono scartate (non viene assegnata loro una cifra).

  4. Le cifre duplicate adiacenti vengono collassate in una sola.

  5. Il risultato viene riempito con zeri (o troncato) fino a esattamente quattro caratteri.

Ecco perché soundex('Robert') e soundex('Rupert') producono entrambi R163 — le vocali diverse vengono ignorate.

Esempio di base

php— editable, runs on the server

Qui la stringa $string viene codificata con soundex(). L'output è:

H464

La H è la prima lettera, e 464 codifica i suoni consonantici l (4), r (6), l (4). Lo spazio e il confine di parola vengono ignorati — Soundex tratta l'input come una sequenza continua di lettere.

Confronto tra due stringhe

L'uso più comune di soundex() è verificare se due parole suonano allo stesso modo confrontando le loro chiavi:

php— editable, runs on the server

Poiché Smith e Smyth vengono entrambi codificati come S530, le loro chiavi corrispondono e l'output è:

The strings sound the same.

Ricerca di un nome in un elenco

Un pattern pratico consiste nel suggerire candidati "volevi dire…" da un elenco noto quando la ricerca esatta fallisce:

<?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";
    }
}
?>

Sia Robert che Rupert condividono la chiave R163 con Ruppert, quindi l'output è:

Robert sounds like Ruppert
Rupert sounds like Ruppert

Limitazioni

  • Orientato all'inglese. La mappatura da lettera a cifra è calibrata per la pronuncia inglese, quindi funziona male per nomi provenienti da altre lingue.
  • La prima lettera deve corrispondere. Poiché Soundex mantiene sempre la prima lettera, Kris (K620) e Chris (C620) non corrispondono, anche se suonano in modo identico.
  • Corrispondenza approssimativa. Solo i primi suoni consonantici vengono conservati, quindi parole lunghe molto diverse possono collidere sulla stessa chiave. Usala come filtro iniziale, non come risposta definitiva.

Per un algoritmo fonetico diverso che spesso gestisce meglio l'inglese, vedere metaphone(). Per misurare quanto vicine sono due stringhe invece di verificare se suonano allo stesso modo, vedere similar-text() e levenshtein().

Pratica

Pratica
Qual è la funzione del sistema Soundex in PHP?
Qual è la funzione del sistema Soundex in PHP?
Was this page helpful?