soundex()
Artigo sobre a função PHP soundex(), usada para calcular a chave Soundex de uma string, útil para comparar pronúncias e correspondência fonética.
A função PHP soundex() calcula a chave Soundex de uma string — um código curto que representa como a string soa em inglês, em vez de como é escrita. Duas palavras com grafias diferentes, mas pronunciadas de forma semelhante (como "Smith" e "Smyth"), produzem a mesma chave, o que torna o Soundex útil para correspondência fonética de nomes, sugestões de correção ortográfica e remoção de duplicatas em listas de contatos.
Esta página aborda a sintaxe de soundex(), o formato da chave retornada, como o algoritmo funciona e exemplos práticos — incluindo suas limitações e como se compara a funções relacionadas.
Sintaxe
soundex(string $string): stringRecebe um parâmetro:
$string— a string de entrada a ser codificada. Apenas os caracteres alfabéticos são considerados; dígitos, espaços e pontuação são ignorados.
Retorna a chave Soundex como uma string. Para entradas alfabéticas não vazias, a chave tem sempre 4 caracteres: uma letra maiúscula seguida de três dígitos (por exemplo, H464). Se a entrada não contiver letras, soundex() retorna uma string vazia.
Como a chave Soundex é construída
O algoritmo Soundex reduz uma palavra à sua primeira letra mais um código de três dígitos baseado nos sons consonantais restantes:
-
Mantém a primeira letra da palavra.
-
Mapeia as letras restantes para dígitos, agrupando consoantes de sons semelhantes:
Letras Dígito b, f, p, v 1 c, g, j, k, q, s, x, z 2 d, t 3 l 4 m, n 5 r 6 -
As vogais
a, e, i, o, ue as letrash, w, ysão descartadas (não recebem dígito). -
Dígitos duplicados adjacentes são colapsados em um só.
-
O resultado é preenchido com zeros (ou truncado) para exatamente quatro caracteres.
É por isso que soundex('Robert') e soundex('Rupert') produzem ambos R163 — as vogais diferentes são ignoradas.
Exemplo básico
Aqui a string $string é codificada com soundex(). A saída é:
H464O H é a primeira letra, e 464 codifica os sons consonantais l (4), r (6), l (4). O espaço e o limite de palavra são ignorados — o Soundex trata a entrada como uma sequência contínua de letras.
Comparando duas strings
O uso mais comum de soundex() é verificar se duas palavras soam igual, comparando suas chaves:
Como Smith e Smyth ambos codificam para S530, suas chaves coincidem e a saída é:
The strings sound the same.Correspondência de um nome com uma lista
Um padrão prático é sugerir candidatos "você quis dizer…" a partir de uma lista conhecida quando uma correspondência exata falha:
<?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";
}
}
?>Tanto Robert quanto Rupert compartilham a chave R163 com Ruppert, portanto a saída é:
Robert sounds like Ruppert
Rupert sounds like RuppertLimitações
- Centrado no inglês. O mapeamento de letras para dígitos é ajustado para a pronúncia em inglês, portanto funciona mal para nomes de outros idiomas.
- A primeira letra deve coincidir. Como o Soundex sempre mantém a primeira letra,
Kris(K620) eChris(C620) não correspondem, mesmo que soem de forma idêntica. - Correspondência grosseira. Apenas os primeiros sons consonantais sobrevivem, portanto palavras longas muito diferentes podem colidir na mesma chave. Use-o como um filtro de primeira passagem, não como resposta definitiva.
Para um algoritmo fonético diferente que frequentemente funciona melhor para o inglês, veja metaphone(). Para medir o quão próximas duas strings são em vez de se soam igual, veja similar-text() e levenshtein().