Bonjour,
Y a-t-il, en PHP, une combine/astuce/fonction qui puisse me dire que les expressions suivantes ne sont pas égales ? :
* tete et tête
* château et chateau
* EPERNAY et ÉPERNAY
etc ...
Je vous remercie.
Bonne journée.
Marcel Marie
Version imprimable
Bonjour,
Y a-t-il, en PHP, une combine/astuce/fonction qui puisse me dire que les expressions suivantes ne sont pas égales ? :
* tete et tête
* château et chateau
* EPERNAY et ÉPERNAY
etc ...
Je vous remercie.
Bonne journée.
Marcel Marie
Aucune de ces expressions ne sont égales quand on les compare tout simplement :
Tout ces tests retournent false.Code:
1
2
3 var_dump('tete' == 'tête'); var_dump('château' == 'chateau'); var_dump('EPERNAY' == 'ÉPERNAY');
c'est naturellement déjà le cas :
Code:
1
2
3 if ("tete" != "tête") { echo 'pas pareil'; }
En résumé, il existe bien une astuce : les comparer ! :mouarf:
Ceci dit, quel rapport avec le titre de la question ("comparaison avec casse") ? :koi:
Eh oui, plus je vieillis, plus je deviens CON ou ÉTOURDI !!!
Je me suis mal exprimé. Il fallait lire " me dire que les expressions suivantes sont égales " ....
* tete et tête
* château et chateau
* EPERNAY et ÉPERNAY
Je voudrais justement que ce soit considéré comme égaux, sans distinction qu'il y ait majuscule ou accent
$coma_nom= "Les Etangs";
$com_nom = "Les Étangs";
La comparaison que je fais, je voudrais que ça me dise que c'est EGAL :
if ($com_nom == $coma_nom )
devrait me dire, OUI, c'est égal ...
Ou alors, je dis bien, "combine" pour ramener une expression en son expression équivalente sans majuscule et sans lettre accentuée ...
Merci.
A bientôt.
Marcel Marie
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 // Fonction qui supprime les accents. Compliquée mais elle fonctionne sans exception function supprAccents($str = null, $encoding = 'UTF-8') { if (!is_string($str)) { return false; } /* transformer les caractères accentués en entités HTML */ $str = htmlentities($str, ENT_NOQUOTES, $encoding); /* remplacer les entités HTML pour avoir juste le premier caractères non accentués * Exemple : "&ecute;" => "e", "&Ecute;" => "E", "Ã " => "a" ... */ $str = preg_replace('#&([A-za-z])(?:acute|grave|cedil|circ|orn|ring|slash|th|tilde|uml);#', '\1', $str); /* remplacer les ligatures tel que : , Æ ... Exemple "Å" => "oe" */ $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); /* Supprime les espaces */ $str = preg_replace('/\s/', '_', $str); /* Supprimer tout le reste */ $str = preg_replace('#&[^;]+;#', '', $str); return $str; } function compare($string1,$string2) { return (strcasecmp(supprAccents($string1),supprAccents($string2))); } var_dump(compare('tete','tête')); // retourne 0 donc les deux chaînes sont équivalentes var_dump(compare('EPERNAY','ÉPERNAY')); //De même
Au cas où ce serait pour comparer avec des données issues d'une bdd, il suffit d'indiquer l'interclassement utf8_general_ci.
Tu peux utiliser cette fonction:L'idée est de passer les deux chaînes en utf8 et en minuscule, puis de remplacer les caractères accentués et les ligatures à l'aide de strtr (l'utilisation d'un tableau associatif permet de s'affranchir du problème de la comparaison octet par octet de cette fonction).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 function strcomp($str1, $str2) { $str1 = mb_strtolower($str1, "UTF-8"); $str2 = mb_strtolower($str2, "UTF-8"); $trans = array ('à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ç'=>'c', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ü'=>'u', 'ÿ'=>'y', 'ñ'=>'n', 'æ'=>'ae', '' =>'oe'); // à compléter eventuellement $str1 = strtr($str1, $trans); $str2 = strtr($str2, $trans); return $str1 === $str2; }
Bonjour,
Merci, j'ai donc utilisé ce que préconise CosmoKnacki qui est plus compréhensible par moi.
Deux détails :
Dans l'instruction,
le "UTF-8" ne plait pas du tout à l'exécution et je l'ai enlevé purement et simplement.Code:$str1 = mb_strtolower($str1, "UTF-8");
les o et e collés, ainsi que a et e, ne sont pas traduits, il faut dire que déjà je ne sais pas les écrire en français en écriture normale !!!!!!
A bientôt.
Marcel Marie