metaphone()
Artículo sobre la función PHP metaphone(), que calcula la clave metafonética de una cadena. Útil para trabajar con cadenas en PHP.
La función metaphone() de PHP calcula la clave metafonética de una cadena — un código que representa cómo suena la cadena en inglés en lugar de cómo se escribe. Las palabras que se pronuncian de forma similar se asignan a la misma clave (o muy parecida), lo que hace que metaphone() sea útil para la coincidencia difusa: "Catherine" y "Katherine", o "Smith" y "Smyth", todas colapsan en una sola clave.
Obsoleta desde PHP 8.4.0.
metaphone()aún funciona en la versión actual de PHP, pero está en camino a ser eliminada. Para código nuevo, se recomienda usar una biblioteca fonética mantenida (osoundex()como alternativa integrada más sencilla). La función está documentada aquí porque muchas bases de código existentes todavía dependen de ella.
Este artículo cubre la sintaxis, el argumento opcional $phonemes, algunos ejemplos prácticos y los casos en los que las claves metafonéticas son realmente útiles.
Sintaxis
metaphone(string $string, int $phonemes = 0): string|false| Parámetro | Descripción |
|---|---|
$string | La cadena de entrada a codificar. |
$phonemes | Opcional. El número máximo de caracteres (fonemas) a devolver. Cuando es 0 (el valor predeterminado), se devuelve la clave completa. |
El valor de retorno es la clave metafonética como una cadena en mayúsculas, o false en caso de error.
Ejemplo básico
Salida:
HLWRLTNótese que los caracteres no alfabéticos como ! y el espacio son ignorados, y el resultado consiste únicamente en códigos de sonidos consonánticos y vocálicos. La clave no está pensada para ser legible por humanos — es una huella digital normalizada de la pronunciación.
Cómo la clave codifica los sonidos
Metaphone aplica reglas de pronunciación del inglés, por lo que la salida no es una transliteración uno a uno. Conviene conocer un par de convenciones:
- El dígito
0(cero) representa el sonido "th". - Las letras silenciosas y duplicadas se eliminan, y algunos pares de letras se fusionan (por ejemplo,
phse convierte enF).
<?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
?>Salida:
0MPSN
SM0
FPLimitar la longitud de la clave con $phonemes
El segundo argumento limita cuántos caracteres puede contener la clave. Esto es útil cuando solo se desea comparar los primeros sonidos de palabras largas.
<?php
echo metaphone("Thompson"), "\n"; // full key
echo metaphone("Thompson", 4), "\n"; // first 4 phonemes only
echo metaphone("Wikipedia", 4), "\n";
?>Salida:
0MPSN
0MPS
WKPTHacer coincidir palabras que suenan igual
El verdadero valor de metaphone es agrupar diferentes grafías del mismo sonido. Compara dos formas de escribir el mismo apellido:
<?php
$a = metaphone("Catherine");
$b = metaphone("Katherine");
echo $a, "\n"; // K0RN
echo $b, "\n"; // K0RN
echo $a === $b ? "Match\n" : "No\n"; // Match
?>Salida:
K0RN
K0RN
MatchDado que ambos nombres comparten una clave metafonética, un índice de búsqueda basado en metaphone() devolvería uno cuando el usuario escribiera el otro — la base de las funciones de "¿quisiste decir…?", la deduplicación de listas de contactos y la búsqueda tolerante de nombres.
Cuándo usarlo (y qué usar en su lugar)
| Caso de uso | Notas |
|---|---|
| Búsqueda difusa de nombres o palabras | Indexa la clave metafonética junto al valor original y luego busca por clave. |
| Búsquedas tolerantes a errores ortográficos | Captura errores tipográficos fonéticos que la coincidencia exacta no detecta. |
| Deduplicación de registros | Agrupa filas cuyos nombres suenan igual. |
metaphone() solo modela la pronunciación del inglés, por lo que no es fiable para otros idiomas. Para medir distancia tipográfica en lugar de sonido, utiliza levenshtein() o similar_text(). Para un código fonético más sencillo y no obsoleto, soundex() es la alternativa integrada.
Resumen
metaphone() convierte una palabra en una clave fonética para que palabras con diferente ortografía pero sonido similar coincidan. Recuerda que la clave codifica la pronunciación en inglés (con 0 representando "th"), que el argumento opcional $phonemes limita la longitud de la clave, y que la función está obsoleta desde PHP 8.4 — usa soundex() o una biblioteca mantenida en proyectos nuevos.