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 chaine exacte [Fait]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut Comparaison chaine exacte
    J'ai fait un test, ca marche bien sauf quand j'ai un mot clé qui compose d'autres mots clé.
    J'ai utilisé "ireplace" pour la casse.

    Voici mon test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $keywords = array("procede", "le", "Septieme art", "cinema");
    $NewKeywords = array("<b>procede</b>", "<b>le</b>", "<b><u>Septieme art</u></b>", "<b>cinema</b>");
    $Definition = "[abreviation de cinematographe] Procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.";
     
    echo $LaDefinition = str_ireplace($keywords, $NewKeywords, $Definition);
    et voici ce que j'obtiens
    [abreviation de cinematographe] procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.
    Par exemple pour le mot cle "le", il me le trouve dans "salle" et je ne veux surtout pas. (idem pour "cinema")
    J'ai donc essayé de mettre $keywords = array(" procede ", " le ");
    Mais ce n'est pas bon, car il peut y avoir des points, virgule etc.... mais pas de lettres par contre.

    Donc je pensais peut etre interdire autour les caracteres ascii des lettres et pas les exclamations et blancs.

    Avez vous une idée?

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Points : 79
    Points
    79
    Par défaut
    As tu tenter la fonction tout simple str_replace ?

  3. #3
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par f.lam Voir le message
    As tu tenter la fonction tout simple str_replace ?
    oui ca ne change rien.
    J'utilise ireplace pour que ca fonctionne quand j'ai par exemple. "Test" et "test".

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Points : 79
    Points
    79
    Par défaut
    Tu fais un explode de ta chaine par le caractere espace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $data = explode ("",$chaine);
    tu boucles sur $data et remplaces tes occurences quand c'est necessaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $string = '';
    foreach ( $data as $key => $value )
    {
       if ( in_array($value,$keywords)) 
           $string .= '<b>'.$value.'</b>';
       else
           $string .= $value ;
    }
     
    echo $string ;
    Pour l'exception <u> souligné, tu peux faire un tableau de keywords de mots gras, un tableau de keywords de mot soulignés ...

  5. #5
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par f.lam Voir le message
    Tu fais un explode de ta chaine par le caractere espace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $data = explode ("",$chaine);
    tu boucles sur $data et remplaces tes occurences quand c'est necessaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $string = '';
    foreach ( $data as $key => $value )
    {
       if ( in_array($value,$keywords)) 
           $string .= '<b>'.$value.'</b>';
       else
           $string .= $value ;
    }
     
    echo $string ;
    Pour l'exception <u> souligné, tu peux faire un tableau de keywords de mots gras, un tableau de keywords de mot soulignés ...
    Merci, par contre cela ne fonctionnera pas pour des expressions cles (pour les mots oui).
    Par exemple "septieme art" sera décomposé en "septieme" puis "art" non?
    Car dans ma base de mot clés il y a aussi des expressions clés.

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 70
    Points : 79
    Points
    79
    Par défaut
    Disons que la, les 2 mots seront bien en gras si "septieme" et "art" sont deux valeurs différentes du tableau $keywords, et c'est apparement le but, par contre, l'etat souligné va mettre 2 mots soulignés separement.

  7. #7
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Après, il y a toujours la solution de faire le parsing à la main.

    Tu parcours ton texte, à la premiere lettre, tu regardes si elle correspond à un mot (ou plusieurs) de ton tableau, si c'est le cas, tu poses un marqueur, et tu fais défiler en parallèle les lettres du mot de ton tableau et du texte. S'il y a différence, tu retourne au marqueur et tu testes avec le mot suivant du tableau (s'il y a lieu), si aucun mot dans le tableau ne correspond, tu recommence le parcours de ton texte à l'emplacement "marqueur".
    Dans la mesure où tu ne veux pas prendre les mots à l'interieur d'autres mots, tu itères jusqu'à tomber sur un caractère qui n'est pas une lettre (attention à la gestion des accents, ce sont bien des lettres), puis, à la premiere lettre suivant le caractère qui n'est pas une lettre, tu recommences la comparaison avec ton tableau.
    Dans le cas où tu arrives à finir un mot de ton tableau, tu sais quand débute le mot (tu as mis un marqueur), tu sais quand il finit (genre, tu es précisement dessus), tu n'as donc plus qu'a remplacer la chaine par la même en souligné, et voila.
    Ca te permet d'avoir "Septieme art" en un seul soulignement, mais c'est un peu plus galère à coder que les solutions d'au dessus. Mais en découpant bien en petites fonctions, ca doit pouvoir se faire relativement vite.

  8. #8
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Rakken Voir le message
    Après, il y a toujours la solution de faire le parsing à la main.

    Tu parcours ton texte, à la premiere lettre, tu regardes si elle correspond à un mot (ou plusieurs) de ton tableau, si c'est le cas, tu poses un marqueur, et tu fais défiler en parallèle les lettres du mot de ton tableau et du texte. S'il y a différence, tu retourne au marqueur et tu testes avec le mot suivant du tableau (s'il y a lieu), si aucun mot dans le tableau ne correspond, tu recommence le parcours de ton texte à l'emplacement "marqueur".
    Dans la mesure où tu ne veux pas prendre les mots à l'interieur d'autres mots, tu itères jusqu'à tomber sur un caractère qui n'est pas une lettre (attention à la gestion des accents, ce sont bien des lettres), puis, à la premiere lettre suivant le caractère qui n'est pas une lettre, tu recommences la comparaison avec ton tableau.
    Dans le cas où tu arrives à finir un mot de ton tableau, tu sais quand débute le mot (tu as mis un marqueur), tu sais quand il finit (genre, tu es précisement dessus), tu n'as donc plus qu'a remplacer la chaine par la même en souligné, et voila.
    Ca te permet d'avoir "Septieme art" en un seul soulignement, mais c'est un peu plus galère à coder que les solutions d'au dessus. Mais en découpant bien en petites fonctions, ca doit pouvoir se faire relativement vite.
    Oui se serait plus ca qu'il me faudrait.... mais oulala c chaud quand meme!
    je vais essayer ca, mais c'est pas gagner...lol
    Merci de ta réponse

    MAJ: si quelqu'un veut bien me donner un coup de main pour se parsing se serait cool...lol... je suis un peu perdu quand meme.

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Il reste encore les fonctionnalités des expressions régulières

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $keywords = array("procede", "le", "Septieme art", "cinema");
    $NewKeywords = array("<b>procede</b>", "<b>le</b>", "<b><u>Septieme art</u></b>", "<b>cinema</b>");
    $Definition = "[abreviation de cinematographe] Procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.";
     
    // Mise en forme des mots clés pour limiter le remplacement aux mots
    $regex = array_map(
        create_function(
            '$keyword',
            'return "#\b".$keyword."\b#Ui";'
            ),
        $keywords);
     
    echo $LaDefinition = preg_replace($regex, $NewKeywords, $Definition);
    Pour l'expression régulière : \b vérifie qu'il s'agit d'une limite de mot, # sont les délimiteurs de la regex, et U et i sont des modificateurs (U pour 'non gourmande' et i pour 'insensible à la casse').

  10. #10
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Eusebe Voir le message
    Bonjour,

    Il reste encore les fonctionnalités des expressions régulières

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $keywords = array("procede", "le", "Septieme art", "cinema");
    $NewKeywords = array("<b>procede</b>", "<b>le</b>", "<b><u>Septieme art</u></b>", "<b>cinema</b>");
    $Definition = "[abreviation de cinematographe] Procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.";
     
    // Mise en forme des mots clés pour limiter le remplacement aux mots
    $regex = array_map(
        create_function(
            '$keyword',
            'return "#\b".$keyword."\b#Ui";'
            ),
        $keywords);
     
    echo $LaDefinition = preg_replace($regex, $NewKeywords, $Definition);
    Pour l'expression régulière : \b vérifie qu'il s'agit d'une limite de mot, # sont les délimiteurs de la regex, et U et i sont des modificateurs (U pour 'non gourmande' et i pour 'insensible à la casse').
    Génial, je viens de tester et ca à l'air nikel.
    En plus ca régle également mon deuxième problème on dirait, pour les définitions des mots clés, je vais tester et je te tiens au courant.

    PS: qu'est ce que tu entends par "non gourmande"?

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par yanchasp Voir le message
    PS: qu'est ce que tu entends par "non gourmande"?
    Voir le tuto sur les expressions régulières :
    http://g-rossolini.developpez.com/tu...ns-regulieres/

    et plus précisément pour les modificateurs :
    http://g-rossolini.developpez.com/tu...e=page_2#LII-7

    Cela signifie que l'expression trouvera des résultats aussi petits que possible.
    En fait, pour ton cas, c'est un modificateur qui ne présente aucun intérêt, mais c'est juste par habitude

  12. #12
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    J'ai tester avec mes defs de mots clés, mais j'ai encore un petit soucis.
    Je le post si jamais tu vois quelques chose.
    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
    require('ConnectBD.php');
    $query2 = 'SELECT nom,formule FROM keyword';
    $result2 = mysql_query($query2);
    $row2 = mysql_fetch_assoc($result2); 
    while ($row2 = mysql_fetch_assoc($result2)){
    	$NewKeywords[]= '<b><i>'.$row2['nom'].'</i></b> ('.$row2['formule'].'';
    	$keywords[]=$row2['nom'];
    }
     
     
    // Mise en forme des mots clés pour limiter le remplacement aux mots
    // Pour l'expression régulière : \b vérifie qu'il s'agit d'une limite de mot, # sont les délimiteurs de la regex, et U et i sont des modificateurs (U pour 'non gourmande' et i pour 'insensible à la casse').
    $regex = array_map(
        create_function(
            '$keyword',
            'return "#\b".$keyword."\b#Ui";'
            ),
        $keywords);
     
    echo $LaDefinition = preg_replace($regex, $NewKeywords, $row['texte']);
    voila, en fait en meme temps que changer l'aspect du mot je veux récupérer la def de ce mot. Pour le test je fais juste un affiche dans la def générale, mais après je le mettrais un lien info bulle avec cette def pour quand on fait un survol de souris.

    Ca marche nikel, quand dans la définition il n'y a aucun mot clé présent dans la base.
    Mais si il y a un mot clé --> ben ca enchaine sur une def, et ca embrouille tous.
    En fait je ne veux pas détecter de mots clés, dans les defs des mots clés.

    Je ne sais pas si je suis assez clair, mais j'espere que tu auras une solution.

    Merci encore et je vais regarder tes liens

  13. #13
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Ca y est ca marche!!! j'ai trouvé.

    Par contre encore une tite question.

    J'ai un soucis quand j'ai un mot qui peut former plusieurs mots clés.
    Par exemple, j'ai comme mots cles dans ma base:
    - marge
    - marge brut
    - marge net

    Si dans un texte j'ai " pour calculer la marge net...." il va me mettre en mots clés "marge" au lieu de "marge net".

    Sinon le reste nikel, tu m'as vachement aidé

  14. #14
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Pour le problème des mots clés contenus dans d'autres, c'est plus difficile...

    Tu pourrais commencer par remplacer marge (par exemple par <b>marge</b>) puis rechercher le remplacement de marge + brute ou nette (donc "<b>marge</b> brute").

    Mais pour ça il faut séparer les mots clés non inclus des autres...

  15. #15
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Pour le problème des mots clés contenus dans d'autres, c'est plus difficile...
    Il y a une astuce. Il faut trier les mots clefs par ordre de taille. Et ne pas reprendre un mot (ou une portion de mot) qui a déjà été taggé.

  16. #16
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Rakken Voir le message
    Il y a une astuce. Il faut trier les mots clefs par ordre de taille. Et ne pas reprendre un mot (ou une portion de mot) qui a déjà été taggé.
    Bonne idée pour le tri, mais je ne trouves pas de requetes SQL correspondante, est ce que tu en connais une ou dois je le faire en php pour le "tri par nombre de caractere plus grand vers plus petit".

  17. #17
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Si tu es sous MySQL, tu peux trier en utilisant la fonction CHAR_LENGTH...

  18. #18
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Eusebe Voir le message
    Si tu es sous MySQL, tu peux trier en utilisant la fonction CHAR_LENGTH...
    Je viens d'essayer, mais une fois que je fais ca, ca ne sert plus a rien vu qu'il remplace tout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $LaDefinition = preg_replace($regex, $NewKeywords, $row['texte']);

  19. #19
    Nouveau membre du Club Avatar de yanchasp
    Inscrit en
    Décembre 2005
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 66
    Points : 26
    Points
    26
    Par défaut
    C'est bon j'ai réussi.
    J'ai en fait crée deux tableau:
    un avec mot cles
    un avec expressions cle (avec les blancs)

    puis je remplace le texte avec les mots cles et ensuite je remplace le nouveau texte avec les expressions cles.


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

Discussions similaires

  1. rechercher une chaine exacte
    Par ybalauze dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/08/2007, 20h30
  2. Réponses: 3
    Dernier message: 12/05/2007, 09h53
  3. lecture fichier et comparaison chaines de caracteres
    Par john123 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 08/05/2007, 11h38
  4. Comparaison chaines de caractères
    Par mmarcoboss dans le forum C
    Réponses: 6
    Dernier message: 19/12/2006, 16h15
  5. Pb de comparaison chaine
    Par Celia1303 dans le forum Access
    Réponses: 5
    Dernier message: 05/05/2006, 16h45

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