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): stringAccetta 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:
-
Si mantiene la prima lettera della parola.
-
Si mappano le lettere rimanenti su cifre, raggruppando le consonanti con suoni simili:
Lettere Cifra b, f, p, v 1 c, g, j, k, q, s, x, z 2 d, t 3 l 4 m, n 5 r 6 -
Le vocali
a, e, i, o, ue le lettereh, w, yvengono scartate (non viene assegnata loro una cifra). -
Le cifre duplicate adiacenti vengono collassate in una sola.
-
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
Qui la stringa $string viene codificata con soundex(). L'output è:
H464La 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:
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 RuppertLimitazioni
- 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) eChris(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().