soundex()
Notre article présente la fonction PHP soundex(), qui calcule la clé Soundex d'une chaîne, utile pour comparer la prononciation de mots.
La fonction PHP soundex() calcule la clé Soundex d'une chaîne — un code court qui représente la façon dont la chaîne sonne en anglais plutôt que la façon dont elle est orthographiée. Deux mots orthographiés différemment mais prononcés de manière similaire (comme « Smith » et « Smyth ») produisent la même clé, ce qui rend Soundex pratique pour la correspondance approximative de noms, les suggestions de correction orthographique et la déduplication de listes de contacts.
Cette page couvre la syntaxe de soundex(), le format de la clé qu'elle retourne, le fonctionnement de l'algorithme, ainsi que des exemples pratiques — y compris ses limites et comment elle se compare aux fonctions apparentées.
Syntaxe
soundex(string $string): stringElle prend un paramètre :
$string— la chaîne d'entrée à encoder. Seuls les caractères alphabétiques sont pris en compte ; les chiffres, les espaces et la ponctuation sont ignorés.
Elle retourne la clé Soundex sous forme de chaîne. Pour une entrée alphabétique non vide, la clé est toujours composée de 4 caractères : une lettre majuscule suivie de trois chiffres (par exemple, H464). Si l'entrée ne contient pas de lettres, soundex() retourne une chaîne vide.
Comment la clé Soundex est construite
L'algorithme Soundex réduit un mot à sa première lettre plus un code à trois chiffres basé sur les sons consonantiques restants :
-
Conserver la première lettre du mot.
-
Associer les lettres restantes à des chiffres, en regroupant les consonnes qui sonnent de façon similaire :
Lettres Chiffre b, f, p, v 1 c, g, j, k, q, s, x, z 2 d, t 3 l 4 m, n 5 r 6 -
Les voyelles
a, e, i, o, uet les lettresh, w, ysont supprimées (aucun chiffre ne leur est attribué). -
Les chiffres en double adjacents sont fusionnés en un seul.
-
Le résultat est complété par des zéros (ou tronqué) pour obtenir exactement quatre caractères.
C'est pourquoi soundex('Robert') et soundex('Rupert') produisent tous deux R163 — les voyelles différentes sont ignorées.
Exemple de base
Ici, la chaîne $string est encodée avec soundex(). La sortie est :
H464Le H est la première lettre, et 464 encode les sons consonantiques l (4), r (6), l (4). L'espace et la limite de mot sont ignorés — Soundex traite l'entrée comme une seule séquence de lettres.
Comparaison de deux chaînes
L'utilisation la plus courante de soundex() consiste à vérifier si deux mots sonnent de la même façon en comparant leurs clés :
Comme Smith et Smyth sont tous deux encodés en S530, leurs clés correspondent et la sortie est :
The strings sound the same.Correspondance d'un nom avec une liste
Un motif pratique consiste à suggérer des candidats « vouliez-vous dire… » à partir d'une liste connue lorsqu'une correspondance exacte échoue :
<?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";
}
}
?>Robert et Rupert partagent tous deux la clé R163 avec Ruppert, donc la sortie est :
Robert sounds like Ruppert
Rupert sounds like RuppertLimites
- Centré sur l'anglais. La correspondance lettre-chiffre est calibrée pour la prononciation anglaise, elle fonctionne donc mal pour les noms d'autres langues.
- La première lettre doit correspondre. Parce que Soundex conserve toujours la première lettre,
Kris(K620) etChris(C620) ne correspondent pas, même s'ils se prononcent de façon identique. - Correspondance grossière. Seuls les premiers sons consonantiques subsistent, de sorte que des mots longs très différents peuvent produire la même clé. Utilisez-la comme filtre de premier passage, pas comme réponse définitive.
Pour un algorithme phonétique différent qui gère souvent mieux l'anglais, voir metaphone(). Pour mesurer à quel point deux chaînes sont proches plutôt que si elles sonnent de la même façon, voir similar-text() et levenshtein().