Analyse chaine carac PHP

DAG -  
 DAG -
Bonjour,

Existe-t-il une fonction en php pour comparer le nombre de caractère identiques de deux chaîne et en sortir le nombre de caractère différents.

En fait je dois comparer deux chaînes (de type adresse) et dire si ce sont les même ou pas.
Cependant, ces deux chaînes on été rentré par des utilisateurs sur deux sites différents et mis en base de données tel quel...

Donc par exemple, pour la même adresse, je peux avoir des trucs du genre :
7, rue des rosiers 93000 PARIS
7, rue des rosiers 93000
7, rue des rosiers
7 rue des rosiers
7 rue des rosiers 93000 PARIS
7 Rue des Rosiers 93000 PARIS
7, rue des rosiers 93000 - PARIS
7, rue des Rosiers 93000 PARIS

Et d'autres possibilités selon le bon vouloir des utilisateurs qui rentrent leurs adresses sur les sites....

Pour l'instant je compare en supprimant les accents et caractères spéciaux. Ensuite je mets tout en majuscule et je remplace les " ' ", " , " , ou " - ", par rien.
Il me reste quand même pas mal de champs différents...

Je souhaiterais donc si j'ai chaîne 1 = "7, rue des rosiers 93000 - PARIS" et chaîne 2 = "7 rue des rosiers" pouvoir détecté que 7 rue des rosiers est commun aux deux. et que par rapport au nombre total de caractères des deux chaînes, je considère ces deux champs comme égaux.

Y a-t-il une fonction ou un bout de code qui répondrait à mon besoin, ou suis-je obligé de le coder par moi même ?
A voir également:

5 réponses

kilian Messages postés 8854 Statut Modérateur 1 526
 
Hhm, ben je crois pas que ça existe non...
0
Utilisateur anonyme
 
bonjour,

soit $chaine1
$tc1 = explode(' ',$chaine1);

$tc1[0] prend pour valeur la première partie avant le premier espace
$tc1[1] prend pour valeur la deuxième partie après le premier espace et avant le second
etc

pareil avec $chaine2 (dans $tc2)

puis ensuite comparer le contenu de chaque poste des tableaux

i.e.
if ($tc1[0]===$tc2[0])


etc etc
0
DAG
 
Merci,
Entre temps j'avais faire un truc... C'était pas forcément ce qu'il y a de mieux, mais en gros l'idée était de mettre en forme les deux chaîne de caractère puis de comparer avec strcasecmp combien de caractères sont différents. Une fois ce résultat obtenu, je le compare à la moiter du nombre de caractères de la plus grande des deux chaîne. Si celui-ci est plus petit ou égale, je considère que les deux chaînes sont égale. Sinon non...

Exemple :
chaîne1 = "test "
chaîne2 = "tests"
1- Je commence par mettre en forme mes champs :
chaîne1 = "TEST"
chaîne2 = "TESTS"
2- J'applique strcasecmp pour trouver les différences. Celui-ci me revoit 1.
3- Je compare 1 au résultat de strlen de la plus grande des deux chaîne qui est 5.
4- Je peux voir que 1 <= 5.
5- je considère que mes chaînes sont égales.
Pioufffff !

Bon c'est pas terrible, c'est un peu laborieux, mais dans mon cas ça marche plutôt pas mal....

Voila le code... :
function compareChaine($chaine1, $chaine2)
{
	echo "Chaîne 1 : " . $chaine1 . ".<br>";
	echo "Chaîne 2 : " . $chaine2 . ".<br>";
	
	$remp1 = strtr($chaine1,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ','aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
	$remp1 = str_replace(' ', '', $remp1);
	$remp1 = str_replace(',', '', $remp1);
	$remp1 = str_replace('-', '', $remp1);
	$remp1 = str_replace('\'', '', $remp1);
	
	$remp2 = strtr($chaine2,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ','aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
	$remp2 = str_replace(' ', '', $remp2);
	$remp2 = str_replace(',', '', $remp2);
	$remp2 = str_replace('-', '', $remp2);
	$remp2 = str_replace('\'', '', $remp2);
	
	$maj1 = mb_strtoupper($remp1);
	$maj2 = mb_strtoupper($remp2);
	
	$diff = strcasecmp($maj1, $maj2);
	
	$nb1 = strlen($maj1);
	$nb2 = strlen($maj2);
	
	echo "Remplace les caractères spéciaux dans chaîne 1: " . $remp1 . ".<br>";
	echo "Remplace les caractères spéciaux dans chaîne 2 : " . $remp2 . ".<br>";
	echo "Mettre en majuscule chaîne 1 : " . $maj1 . "<br>";
	echo "Mettre en majuscule chaîne 2: " . $maj2 . "<br>";
	echo "Nombre de caractères dans la chaîne 1 : " . $nb1 . ".<br>";
	echo "Nombre de caractères dans la chaîne 2 : " . $nb2 . ".<br>";
	echo "Nombre de caractères différents entre les deux chaînes : " . -$diff . ".<br>";

	if($nb1 > $nb2)
	{
		$result = ($nb1/2)+1;
		echo "La chaîne 1 est plus grande que la chaîne 2<br>";
		if(-$diff <= $result)
		{
			echo "Result = " . $result . " Soit > " . -$diff . "     Les chaînes sont égales.<br>";
		}
			elseif(-$diff > $result)
		{
			echo "Result = " . $result . " Soit <= " . -$diff . "     Les chaînes ne sont pas égales.<br>";
		}
	}
	elseif($nb2 > $nb1)
	{
		$result = ($nb2/2)+1;
		echo "La chaîne 2 est plus grande que la chaîne 1<br>";
		if(-$diff <= $result)
		{
			echo "Result = " . $result . " Soit > " . -$diff . "     Les chaînes sont égales.<br>";
		}
			elseif(-$diff > $result)
		{
			echo "Result = " . $result . " Soit <= " . -$diff . "     Les chaînes ne sont pas égales.<br>";
		}
	}
}
0
Mikey_UFC Messages postés 315 Statut Membre 1
 
Ca ne veut pas dire par hasard que ces adresses sont les mêmes pour toi :

7 rue des rosiers 93000 Paris
9 rue des rosiers 93000 Paris
2 rue des rosiers 69000 Lyon
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DAG
 
ah ouais... mince, je vais essayer de rectifier le tir !

Merci !
0