Je pense que tu obtiendras le meilleur rapport entre le développement requis et le résultat obtenu en utilisant la fonction metaphone() de PHP. Par exemple, voici un exemple 'une fonction qui crée un hash à partir d'un mot. Ce hash (un entier non-signé qui ne dépasse pas 2^31, destiné à être stocké dans un champs SQL INT) correspond à la phonetique des 6 premières syllabes.
/**
* Generate the metaphone hash of a word
*
* @param string $word The word
* @return integer The hash
*/
function metaphone_hash($word)
{
static $val_ary = array(
'0' => array(5153632, 234256, 10648, 484, 22, 1),
'A' => array(10307264, 468512, 21296, 968, 44, 2),
'B' => array(15460896, 702768, 31944, 1452, 66, 3),
'E' => array(20614528, 937024, 42592, 1936, 88, 4),
'F' => array(25768160, 1171280, 53240, 2420, 110, 5),
'H' => array(30921792, 1405536, 63888, 2904, 132, 6),
'I' => array(36075424, 1639792, 74536, 3388, 154, 7),
'J' => array(41229056, 1874048, 85184, 3872, 176, 8),
'K' => array(46382688, 2108304, 95832, 4356, 198, 9),
'L' => array(51536320, 2342560, 106480, 4840, 220, 10),
'M' => array(56689952, 2576816, 117128, 5324, 242, 11),
'N' => array(61843584, 2811072, 127776, 5808, 264, 12),
'O' => array(66997216, 3045328, 138424, 6292, 286, 13),
'P' => array(72150848, 3279584, 149072, 6776, 308, 14),
'R' => array(77304480, 3513840, 159720, 7260, 330, 15),
'S' => array(82458112, 3748096, 170368, 7744, 352, 16),
'T' => array(87611744, 3982352, 181016, 8228, 374, 17),
'U' => array(92765376, 4216608, 191664, 8712, 396, 18),
'W' => array(97919008, 4450864, 202312, 9196, 418, 19),
'X' => array(103072640, 4685120, 212960, 9680, 440, 20),
'Y' => array(108226272, 4919376, 223608, 10164, 462, 21)
);
$val = 0;
foreach (str_split(metaphone($word, 6), 1) as $i => $c)
{
$val += $val_ary[$c][$i];
}
return $val;
}
Pour chaque ville tu stockes le hash correspondant dans un champs indexé, puis si tu cherches les noms s'approchant de ce qu'a entré l'utilisateur ta requête ressemble à
$sql = 'SELECT * FROM villes WHERE ville_hash = ' . metaphone_hash($ville);