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 :

comment ne pas tenir compte des mots de liaisons tels que le, la, les, et, etc. [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut comment ne pas tenir compte des mots de liaisons tels que le, la, les, et, etc.
    Bonjour a tous,
    Voila mon problème :

    J'ai créé un champ de formulaire pour faire une recherche sur une base de donnée mais lorsque je tape par exemple « le chat et la souris » les mots « le », « et », « la » sont pris en compte dans la recherche ce qui ne m’aide pas sur le nombre de résultats obtenu qui peut être très important.
    Je souhaiterai que la recherche se fasse sur les seuls mots « chat » et « souris » sans tenir compte des mots de moins de 4 caractères par exemple.
    Quelle est la commande à taper pour ce type de requête en fait je voudrai que le script efface ces petit mots pendant son exécution.
    Merci d’avance pour vos futures réponses


    Avant de poster faites une recherche et/ou consultez la FAQ.

    Un sujet est résolu n'oubliez pas le tag

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    soit tu définis une liste de mots a ignorer dans un tableau, ensuite tu découpes ta chaine en un tableau de mots et tu utilises une boucle sur les éléments du tableau de ta chaine pour vérifier que ca n'est pas un mot a ignorer.

    tu peux aussi simplement découper les mots de ta chaine en un tableau (explode()) et ensuite tu vérifies que chaque mot a une taille supérieure a 3 par exemple

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Merci koopajah pour ta réponse rapide.

    Je pense que la deuxième solution serai la plus simple j'ai déja decouper les mots dans un tableau mais je ne sais pas comment supprimer les mot de plus de 3 lettres a l'interieur de celui ci avant de les envoyer a ma base de donnée.


    Avant de poster faites une recherche et/ou consultez la FAQ.

    Un sujet est résolu n'oubliez pas le tag

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par kilian67
    Merci koopajah pour ta réponse rapide.

    Je pense que la deuxième solution serai la plus simple j'ai déja decouper les mots dans un tableau mais je ne sais pas comment supprimer les mot de plus de 3 lettres a l'interieur de celui ci avant de les envoyer a ma base de donnée.
    Comme je mets toujours une heure a retrouver la fonction qui permet d'effacer une partie d'un tableau (et qu'elle est pas instinctive) je te donne une autre solution :
    tu parcours ton tableau, et tu ajoutes dans un nouveau tableau les mots a rechercher (donc pas ceux de moins de 4 lettres)

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $out = trim(preg_replace('~\s*\b\S{1,3}\b\s*~', ' ', $in));

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Merci koopajah je vais essayer ta solution bien que je ne saist pas encore comment faire.

    julp j'ai essayer ta ligne de code mais ça ne me donne pas le résultat voulu.


    Merci encore pour votre aide


    Avant de poster faites une recherche et/ou consultez la FAQ.

    Un sujet est résolu n'oubliez pas le tag

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par kilian67
    j'ai essayer ta ligne de code mais ça ne me donne pas le résultat voulu.
    C'est à dire ? Parce que vous ne récupérez pas un tableau ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $mots = preg_split('~\s~', preg_replace('~\b\S{1,3}\b~', ' ', $phrase), -1, PREG_SPLIT_NO_EMPTY);
    print_r($mots);
    Si vous souhaitez éliminer des mots précis, faites en une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $excludes = array('l[ea]s?', 'des?', /* ... */);
    $mots = preg_split('~\s~', preg_replace('~\b(?:' . implode('|', $excludes) . ')\b~', ' ', $phrase), -1, PREG_SPLIT_NO_EMPTY);
    print_r($mots);
    (non testé)

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Je recupere deja dans un tableau mais le probleme est que j'ai essayer les differentes solutions que vous me donnez mais je pense plutot que je ne les places pas au bon endroits.

    Pour faire plus simple voici mon script

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    <?$Q = $_POST['recherche'];
    $_POST['recherche'] = $Q ;
     
    // on donne le lien de la page necessaire  pour les paramètres de connexion
    require("parametres.php");
     
    // on se connecte au serveur (modif dans les parametres)
    $Connexion = mysql_connect($Host, $Login, $Pass) or  die ("<br><br><p><center><table width=\"70%\" bgcolor=\"#990000\" border=\"0\" cellspacing=\"0\" cellpadding=\"1\"><tr><td><center><h1>Connexion au serveur <big><u>\"$Host\"</u></big> impossible<br>Veuillez contactez le webmaster pour lui signaler le problème</h1>
    											</td></tr></table><p></p><p>&nbsp;</p></center></td></tr>");
    mysql_select_db("$Database",$Connexion);
     
    // on verifie si le champs de recherche contient un ou plusieurs mots (sauf le, la, les, de, des, etc.....)
    if(!empty($_POST['recherche'])){
     
    // si le champs est bien rempli on execute le reste du script
     
    // on passe les mots recherchés en minuscules
    $Q = strtolower($Q);
     
    // on remplace les ( ' + , :  et le mots de 3 lettres indesirables)  par des espaces ou rien
    $mots = str_replace('+', ' ', trim($Q));
    $mots = str_replace('\'', ' ', trim($mots));
    $mots = str_replace(',', ' ', trim($mots));
    $mots = str_replace('?', ' ', trim($mots));
    $mots = str_replace('_', ' ', trim($mots));
    $mots = str_replace(':', ' ', trim($mots));
    $mots = str_replace('   ', ' ', trim($mots));
    $mots = str_replace('  ', ' ', trim($mots));
     
     
    // on place les differents mots dans un tableau
    $tab = explode(' ' , $mots);
     
    // on compte le nbr d'élément du tableau.
    $nb = count($tab);
     
    //on prépare la requête SQL (modif dans les parametres)
    $sql = "SELECT $Champs FROM $Table WHERE $Cles LIKE '%$tab[0]%'"or die(mysql_error()) ;
     
    // on boucle pour integrer tous les mots dans la requête (modif dans les parametres)
    for($i = 1; $i < $nb; $i++){
    $sql .= "$EtOu $Cles LIKE '%$tab[$i]%'";
    }
     
    // on donne l'ordre d'affichage (modif dans les parametres)
    $sql .= "ORDER BY $Ordre ASC";
     
    // Si un seul enregistrement est trouvé, on affiche un message au singulier
    if ($nb == "1") {
    echo "<br><br><br><span style=\"font-size:16pt;\"><font color=\"#009999\">Résultat de votre requète concernant le mot <b><u>\"$Q\"</u></b></font></span><br><p>";
    }
     
    // Dans le cas contraire le message est au pluriel...	
    else {
    echo "<br><br><br><span style=\"font-size:16pt;\"><font color=\"#009999\">Résultat de votre requète concernant les mots <b><u>\"$Q\"</u></b></font></span><br><p>";
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // on execute la requête SQL en fait c'est un premier tour pour afficher le nombre de résultats obtenu en haut
    $Res = mysql_db_query($Database, $sql);
    $Result = 1;
    while($data = mysql_fetch_array($Res)){
    $Result++;
    }
    // On creer une variable en elevant 1 pour avoir un résultat corect
    $Resultat = $Result - 1 ;
     
     
    // Si un seul enregistrement est trouvé, on affiche un message au singulier
    if ($Resultat == 0) {
    echo "<p><br><br><br><span style=\"font-size:16pt;\"><font color=\"#FF0000\">Aucun résultats pour <b>\"".$_POST['recherche']."\"</font></span></p>";
    }else
    // Si un seul enregistrement est trouvé, on affiche un message au singulier
    if ($Resultat == 1) {
    echo "<br><br><span style=\"font-size:16pt;\"><font color=\"#009999\">Résultat: Une réponse</u></b></font></span><p>";
    }
    else {
    // Dans le cas contraire le message est au pluriel...	
    echo "<br><br><span style=\"font-size:16pt;\"><font color=\"#009999\">Résultats: $Resultat réponses</u></b></font></span><p>";
    mysql_free_result($Res);
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    // formulaire pour une seconde recherche
    echo
    "<center>
        <p>&nbsp;</p>
      <form method=\"post\" action='$PageResultats'>
      <input type=\"text\" maxLength=\"50\" size=\"40\" name=\"recherche\" value=\"Essayez avec d'autres mots clés\">
    <input type=\"submit\" name=\"value\" value=\"go !\">
    </form>
    </center>";
     
    // on execute la requête SQL cette fois c'est pour l'affichage des résultats de la requete
    $Res = mysql_db_query($Database, $sql);
     
    //boucle de recherche et affichage des résultats de la requete
    $Result = 1;
    while($data = mysql_fetch_array($Res)){
    ?>
    <p>&nbsp;</p>
         <table width="70%" border="0" cellpadding="0" cellspacing="0">
    	      <tr>
    <?php
     
    // Ci dessous correspond au titre qui sera afficher dans la liste des réponses          
    echo '<td width="70%"><img src="mpi\images\mpi.jpg" width="30" height="30" border="0"><font face="Bodoni MT Condensed" size="6" color="#FFFFFF"><b>    '.$Result.'.    </font><a href="'.htmlentities($data["$Entree3"]).'" target="_blank"><font face="Bodoni MT Condensed" size="5" color="#00CC66">'.htmlentities($data["$Entree1"]).'</b></font></a></td>';
    ?>
              </tr>
              <tr>
    <?php
     
    // Ci dessous correspond a l'affichage de la description de la réponse	    
    echo '<td><font face="garamond" color="#666666" size="5">'.htmlentities($data["$Entree2"]).'</font></td>';
    ?>		  
    		  </tr> 
    	 </table>
     
    <?php
    $Result++;
    }
     
    // on ferme la connexion
    mysql_close($Connexion);
     
    // s'il n'y a pas de mot on donne un message d'erreur avec demande de renouvelement avec d'autre mots clés
    }else{
        echo "<br><br><br><br><br><br><br><span style=\"font-size:18pt;\"><font color=\"#FF0000\">Les mots clés utilisés ne sont pas adaptés.<br><br><br>
    Il faut renouveler votre recherche en changeant les mots clés.<br><br><br>
    Il ne faut pas utiliser des mots de liaison tels que le, la, les, de, des, etc …<br><br><br>
    </u></b></font></span><br><p>";
    // formulaire pour une seconde recherche
    echo
    "<center>
        <p>&nbsp;</p>
      <form method=\"post\" action='$PageResultats'>
      <input type=\"text\" maxLength=\"50\" size=\"40\" name=\"recherche\" value=\"Essayez avec d'autres mots clés\">
    <input type=\"submit\" name=\"value\" value=\"go !\">
    </form>
    </center>";
    }
     
     
    ?>


    Avant de poster faites une recherche et/ou consultez la FAQ.

    Un sujet est résolu n'oubliez pas le tag

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    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
    // on passe les mots recherchés en minuscules
    $Q = strtolower($Q);
     
    // on remplace les ( ' + , :  et le mots de 3 lettres indesirables)  par des espaces ou rien
    $mots = str_replace('+', ' ', trim($Q));
    $mots = str_replace('\'', ' ', trim($mots));
    $mots = str_replace(',', ' ', trim($mots));
    $mots = str_replace('?', ' ', trim($mots));
    $mots = str_replace('_', ' ', trim($mots));
    $mots = str_replace(':', ' ', trim($mots));
    $mots = str_replace('   ', ' ', trim($mots));
    $mots = str_replace('  ', ' ', trim($mots));
     
     
    // on place les differents mots dans un tableau
    $tab = explode(' ' , $mots);
     
    // on compte le nbr d'élément du tableau.
    $nb = count($tab);
    Deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // on passe les mots recherchés en minuscules
    $Q = strtolower($Q);
     
    // on supprime le superflux, ie tout ce qui n'est pas un "mot" de plus de trois lettres
    $tab = preg_split('~[\s[:punct:]]~', preg_replace('~\b\S{1,3}\b~', ' ', $Q), -1, PREG_SPLIT_NO_EMPTY);
     
    // on compte le nbr d'élément du tableau.
    $nb = count($tab);
    On peut aussi utiliser preg_match_all au lieu de preg_split + preg_replace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // on passe les mots recherchés en minuscules
    $Q = strtolower($Q);
     
    // on supprime le superflux, ie tout ce qui n'est pas un "mot" d'au moins quatre lettres
    preg_match_all('~\b\w{4,}\b~', $Q, $tab);
    $tab = array_values($tab[0]); // Pour ne pas avoir à modifier le restant de votre code
     
    // on compte le nbr d'élément du tableau.
    $nb = count($tab);


    Par contre votre appel à strtolower n'est peut être plus utile.

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Trop fort un grand merci votre code fonctionne

    Celui la :

    // on passe les mots recherchés en minuscules
    $Q = strtolower($Q);

    // on supprime le superflux, ie tout ce qui n'est pas un "mot" de plus de trois lettres
    $tab = preg_split('~[\s[:punct:]]~', preg_replace('~\b\S{1,3}\b~', ' ', $Q), -1, PREG_SPLIT_NO_EMPTY);

    // on compte le nbr d'élément du tableau.
    $nb = count($tab);
    Par contre bien que cela ne me dérange pas j'ai fait un essai en tapant
    le
    la
    les
    tous seul dans le champs de recherche et le script m'affiche pratiquement tous ce qu'il y a dans ma base de donnée.

    Y a t'il un moyen de faire en sorte que le script affiche plutôt le message demandant de changer de mots clés ???

    En fait si j'abuse avec cette demande c'est dans un soucis de perfection


    Avant de poster faites une recherche et/ou consultez la FAQ.

    Un sujet est résolu n'oubliez pas le tag

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Il faudrait tester ce qu'il "reste" via votre variable $nb avant même de faire la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!$nb) {
        # Erreur à notifier
    } else {
        # Suite normale
    }

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    496
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 496
    Points : 467
    Points
    467
    Par défaut
    Ok merci beaucoup

    Pour moi le sujet est clos et résolu.

    tout fonctionne a merveille


    Avant de poster faites une recherche et/ou consultez la FAQ.

    Un sujet est résolu n'oubliez pas le tag

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

Discussions similaires

  1. Ne pas tenir compte des accent dans une requete
    Par prat038 dans le forum SQL
    Réponses: 8
    Dernier message: 07/09/2009, 13h34
  2. [MySQL] ne pas tenir compte des variables non utilisées pour éviter les bugs
    Par canary dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 26/03/2009, 08h46
  3. [vba] ne pas tenir compte des majuscules/minuscules
    Par bungler dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/07/2007, 09h07
  4. [DEBUTANT] comment ne pas tenir compte de la casse?
    Par Jidefix dans le forum Oracle
    Réponses: 5
    Dernier message: 05/01/2007, 12h10
  5. Ne pas tenir compte des accents dans une requete
    Par zamanika dans le forum Installation
    Réponses: 8
    Dernier message: 08/11/2004, 19h49

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