<?PHP
/**
* fonction consonnex (chaîne $mot)
* auteur Michel Barthélémy Billard Sirakawa (sirakawa.fr)
* 2014
* Aménagement du soundex pour tenir compte de quelques particularités de la prononciation française.
* Paramètre : $mot chaine de caractères en UTF-8
* Retour : $consonnes chaine de caractères représentative du consonantisme du mot passé en paramètre ou false si ce mot est vide.
* Requiert la gestion des caractères multibytes de php avtivée et l'emploi du codage UTF-8. 
* usage : $consonnes = consonnex("monnayeur");
* Contrairement au soundex dont il s'inspire, consonnex n'élimine pas les voyelles en premier car elles participent à la 
* différenciation de certains sons comme CA / CE, ni le h et le y pour des raisons analogues.
* Les chiffres, qui n'ont aucun sens particulier, ont été remplacés par des lettres ou des caractères unicode API.
*/
function consonnex ($mot)
{
	mb_internal_encoding ("utf-8");

	/**
	* $groupes tableau de tableaux de chaines
	* Structure qui parait lourde mais facilite le maintien de la cohérence.
	* une ligne par lettre ou groupe de lettres qui sera remplacé
	*     clef : la lettre ou le groupe de lettres
	*     tableau : la lettre ou le groupe de lettres, le remplaçant.
	* L'ordre des lignes conditionne l'ordre des traitements: il faut mettre les groupes de lettres avant les lettres simples.
	*/
	$groupes = array (

		"bb" => array ("bb", "b"),
		"bh" => array ("bh", "b"),
		"br" => array ("br", "&#946;"),
		"bl" => array ("bl", "&#914"),
		"b" => array ("b", "b"),
		"ç" => array ("ç", "s"),
		"chol" => array( "chol", "("),
		"chor" => array( "chor", ")"),
		"chr" => array ("chr", "!"),
		"chl" => array ( "chl", ":"),
		"ch" => array ("ch","&#644;" ),
		"ca" => array ("ca", "k"),
		"câ" => array ("câ", "k"),
		"cà" =>  array ("cà", "k"),
		"co" => array ("co", "k"),
		"cô" => array ("cô", "k"),
		"cu" => array ("cu", "k"),
		"cû" => array ("cû", "k"),
		"ce" => array ("ce", "s"),
		"cé" => array ("cé", "s"),
		"ci" => array ("ci", "s"),
		"c" => array ("ci", "s"),
		"dd" => array ("dd", "d"),
		"dh" => array ("dd", "d"),
		"dr" => array ("dr", "-"),
		"d" => array ("d", "d"),
		"ff" => array ("ff", "f"),
		"ffl" => array ("ffl", ","),
		"fl" => array ("fl", "§"),
		"ffr" => array ("ffr", "*"),
		"fr" => array ("fr", "µ"),
		"f" => array ("f", "f"),
		"gr" => array("gr", "£"),
		"gl" => array("gl", "="),
		"gua" => array ("gua", "g"),
		"gue" => array ("gue", "g"),
		"gui" => array ("gui", "g"),
		"guo" => array ("guo", "g"),
		"ga" => array ("ga", "g"),
		"ge" => array ("ge", "j"),
		"gui" => array ("gi", "g"),
		"go" => array ("go", "g"),
		"gl" => array ("gl", "+"),
		"gr" => array ("gr", "°"),
		"j" => array ("j", "j"),
		"kkh" => array ("kkh","k"),
		"kh" => array ("kh","k"),
		"k" => array ("k","k"),
		"ill" => array ("ill", "y"),
		"illi" => array ("illi", "y"),
		"ll" => array ("ll", "l"),
		"mm" => array ("mm", "m"),
		"nn" => array ("nn", "n"),
		"ph" => array("ph", "f"),
		"pp" => array("pp", "p"),
		"qu" => array ("qu", "k"),
		"rr" => array ("rr", "r"),
		"rh" => array ("rh", "r"),
		"asa" => array ("asa", "z"),
		"ase" => array ("ase", "z"),
		"asi" => array ("asi", "z"),
		"aso" => array ("aso", "z"),
		"esu" => array ("asu", "z"),
		"esa" => array ("esa", "z"),
		"ese" => array ("ese", "z"),
		"esi" => array ("esi", "z"),
		"eso" => array ("eso", "z"),
		"esu" => array ("esu", "z"),
		"isa" => array ("isa", "z"),
		"ise" => array ("ise", "z"),
		"isi" => array ("isi", "z"),
		"iso" => array ("iso", "z"),
		"isu" => array ("isu", "z"),
		"osa" => array ("osa", "z"),
		"ose" => array ("ose", "z"),
		"osi" => array ("osi", "z"),
		"oso" => array ("oso", "z"),
		"osu" => array ("osu", "z"),
		"usa" => array ("usa", "z"),
		"use" => array ("use", "z"),
		"usi" => array ("usi", "z"),
		"uso" => array ("uso", "z"),
		"usu" => array ("usu", "z"),
		"ss" => array ("ss", "s"),
		"th" => array ("th", "t"),
		"tt" => array ("tt", "t"),
		"aya" => array ("aya", "y"),
		"aye" => array ("aye", "y"),
		"ayi" => array ("ayi", "y"),
		"ayo" => array ("ayo", "y"),
		"ayu" => array (-"ayu", "y"),
		"h"  => array ("h", ""),
		 "a" => array("a", ""),
		"â"	 => array ("â", ""),
		"à" => array ( "à", ""),
		"ä" => array ("à", ""),
		"e" => array ("e", ""),
		"é" => array ("é", ""),
		"è" => array ("è", ""),
		"ê" => array ("ê", ""),
		"ë" => array ("ë", ""),

		 "i" => array("i", ""),
		"î"	 => array ("î", ""),
		"ï" => array ("ï", ""),
	 	"o" => array("o", ""),
		"ô"	 => array ("ô", ""),
		"û" => array("û", ""),
		"u"	=> array ("u", ""),
		"ü" => array ("ü", ""),
		"esp" => array(" ", ""),

	);
	$lettres = array();
	$remplacants = array();
	/**
	* Le tableau global est réparti entre $lettres qui contient les lettres et groupes de lettres à remplacer
	* et remplacants qui contient les remplacantq correspondants.
	*/
	foreach ($groupes as $element)
	{
		$lettres[] = $element[0];
		$remplacants[] = $element[1];
	}
	/**
	* Le mot est débarrassé des espaces extérieurs.
	*/
	$mot = mb_strtolower(trim($mot));

	/**
	* Refus des mots vides
	*/
	if ($mot == "")
	{
		print "Il est inutile de charcher à coder un mot vide.";
		return false;

	}
	/**
	* Utilisation de str_replace pour construire en une seule instruction $consonnes.
	*/
	$consonnes = str_replace ($lettres, $remplacants, $mot);
	return $consonnes;
}

function comparer ($mot1, $mot2)
{
	mb_internal_encoding ("utf-8");
	$ressemblance = 0;
	$longueur = mb_strlen($mot1);
	for ($i = 0; $i < $longueur; $i++)
	{
		$l1 = mb_substr($mot1, $i,1);
		$l2 = (null !== mb_substr($mot2, $i,1)) ?  mb_substr($mot2, $i,1) : "";	
		$ressemblance += ($l1 == $l2) ? 1:0;
	}
	$ressemblance = round(($ressemblance /$longueur) *100, 0);
return $ressemblance; 
}
?>
