metaphone()
Articolo sulla funzione PHP metaphone(), che calcola la chiave metafona di una stringa per confronti fonetici approssimati.
La funzione PHP metaphone() calcola la chiave metafona di una stringa — un codice che rappresenta come la stringa suona in inglese piuttosto che come si scrive. Le parole pronunciate allo stesso modo producono la stessa chiave (o una molto simile), il che rende metaphone() utile per la corrispondenza approssimata: "Catherine" e "Katherine", oppure "Smith" e "Smyth", convergono tutte sulla stessa chiave.
Deprecata da PHP 8.4.0.
metaphone()funziona ancora nel PHP attuale, ma è destinata alla rimozione. Per il nuovo codice, preferire una libreria fonetica mantenuta (oppuresoundex()per un'alternativa integrata più semplice). La funzione è documentata qui perché molte codebase esistenti ne fanno ancora uso.
Questo articolo tratta la sintassi, l'argomento opzionale $phonemes, alcuni esempi pratici e i casi d'uso reali delle chiavi metafona.
Sintassi
metaphone(string $string, int $phonemes = 0): string|false| Parametro | Descrizione |
|---|---|
$string | La stringa di input da codificare. |
$phonemes | Opzionale. Il numero massimo di caratteri (fonemi) da restituire. Con 0 (impostazione predefinita), viene restituita la chiave completa. |
Il valore restituito è la chiave metafona come stringa maiuscola, oppure false in caso di errore.
Esempio di base
Output:
HLWRLTSi noti che i caratteri non alfabetici come ! e lo spazio vengono ignorati, e il risultato è composto esclusivamente da codici sonori consonantici e vocalici. La chiave non è pensata per essere leggibile da un essere umano — è un'impronta normalizzata della pronuncia.
Come la chiave codifica i suoni
Metaphone applica le regole di pronuncia dell'inglese, quindi l'output non è una traslitterazione uno a uno. Vale la pena conoscere alcune convenzioni:
- La cifra
0(zero) rappresenta il suono "th". - Le lettere mute e duplicate vengono eliminate, e alcune coppie di lettere si contraggono (ad esempio
phdiventaF).
<?php
echo metaphone("Thompson"), "\n"; // 0MPSN — "Th" → 0, silent p kept by the rule
echo metaphone("Smith"), "\n"; // SM0 — trailing "th" → 0
echo metaphone("PHP"), "\n"; // FP — "ph" → F
?>Output:
0MPSN
SM0
FPLimitare la lunghezza della chiave con $phonemes
Il secondo argomento limita il numero di caratteri che la chiave può contenere. È utile quando si vogliono confrontare solo i primi suoni di parole lunghe.
<?php
echo metaphone("Thompson"), "\n"; // full key
echo metaphone("Thompson", 4), "\n"; // first 4 phonemes only
echo metaphone("Wikipedia", 4), "\n";
?>Output:
0MPSN
0MPS
WKPTAbbinare parole che suonano allo stesso modo
Il vero valore di metaphone è raggruppare grafie diverse dello stesso suono. Confrontiamo due grafie dello stesso cognome:
<?php
$a = metaphone("Catherine");
$b = metaphone("Katherine");
echo $a, "\n"; // K0RN
echo $b, "\n"; // K0RN
echo $a === $b ? "Match\n" : "No\n"; // Match
?>Output:
K0RN
K0RN
MatchPoiché entrambi i nomi condividono la stessa chiave metafona, un indice di ricerca basato su metaphone() restituirebbe l'uno quando l'utente digita l'altro — la base delle funzionalità "intendevi…?", della deduplicazione delle rubriche e della ricerca tollerante ai nomi.
Quando usarla (e cosa usare al suo posto)
| Caso d'uso | Note |
|---|---|
| Ricerca approssimata di nomi/parole | Indicizzare la chiave metafona accanto al valore originale, poi abbinare sulla chiave. |
| Ricerche tolleranti agli errori ortografici | Intercetta errori tipografici fonetici che la corrispondenza esatta non coglie. |
| Deduplicazione di record | Raggruppa le righe i cui nomi suonano allo stesso modo. |
metaphone() modella solo la pronuncia inglese, quindi non è affidabile per altre lingue. Per la distanza da errori di battitura anziché per il suono, ricorrere a levenshtein() o similar_text(). Per un codice fonetico più semplice e non deprecato, soundex() è l'alternativa integrata.
Riepilogo
metaphone() trasforma una parola in una chiave fonetica in modo che parole scritte diversamente ma pronunciate in modo simile corrispondano. Ricordare che la chiave codifica la pronuncia inglese (con 0 che rappresenta "th"), che l'argomento opzionale $phonemes limita la lunghezza della chiave, e che la funzione è deprecata a partire da PHP 8.4 — preferire soundex() o una libreria mantenuta per i nuovi progetti.