IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comparaison avec casse


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    retraité, ex chef de projets en informatique
    Inscrit en
    Juillet 2005
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité, ex chef de projets en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2005
    Messages : 602
    Par défaut Comparaison avec casse
    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

  2. #2
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Aucune de ces expressions ne sont égales quand on les compare tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var_dump('tete' == 'tête');
    var_dump('château' == 'chateau');
    var_dump('EPERNAY' == 'ÉPERNAY');
    Tout ces tests retournent false.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    c'est naturellement déjà le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ("tete" != "tête") {
       echo 'pas pareil';
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    En résumé, il existe bien une astuce : les comparer !

    Ceci dit, quel rapport avec le titre de la question ("comparaison avec casse") ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre éclairé
    Homme Profil pro
    retraité, ex chef de projets en informatique
    Inscrit en
    Juillet 2005
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité, ex chef de projets en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2005
    Messages : 602
    Par défaut
    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

  6. #6
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Au cas où ce serait pour comparer avec des données issues d'une bdd, il suffit d'indiquer l'interclassement utf8_general_ci.

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 018
    Par défaut
    Tu peux utiliser cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }
    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).

  9. #9
    Membre éclairé
    Homme Profil pro
    retraité, ex chef de projets en informatique
    Inscrit en
    Juillet 2005
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité, ex chef de projets en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2005
    Messages : 602
    Par défaut
    Bonjour,
    Merci, j'ai donc utilisé ce que préconise CosmoKnacki qui est plus compréhensible par moi.
    Deux détails :
    Dans l'instruction,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str1 = mb_strtolower($str1, "UTF-8");
    le "UTF-8" ne plait pas du tout à l'exécution et je l'ai enlevé purement et simplement.

    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison avec BSTR
    Par Sarkou dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 17/11/2006, 15h38
  2. [Oracle] type date: comparaison avec l'année en cours
    Par zchallal dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/06/2006, 07h39
  3. comparaison avec strcmp
    Par je®ome dans le forum C
    Réponses: 9
    Dernier message: 23/05/2006, 18h09
  4. [debutant] Comparaison sans casse !
    Par Tchinkatchuk dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/04/2005, 14h50
  5. comparaison avec substring
    Par tidan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2005, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo