Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/08/2007, 11h30   #1
Membre éprouvé
 
Inscription : août 2007
Messages : 496
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2007
Messages : 496
Points : 447
Points : 447
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
kilian67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 11h33   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 11h40   #3
Membre éprouvé
 
Inscription : août 2007
Messages : 496
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2007
Messages : 496
Points : 447
Points : 447
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.
kilian67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 12h02   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
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)
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2007, 14h17   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Peut être :
Code :
$out = trim(preg_replace('~\s*\b\S{1,3}\b\s*~', ' ', $in));
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 14h26   #6
Membre éprouvé
 
Inscription : août 2007
Messages : 496
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2007
Messages : 496
Points : 447
Points : 447
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
kilian67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 14h53   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
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 :
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é)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 15h17   #8
Membre éprouvé
 
Inscription : août 2007
Messages : 496
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2007
Messages : 496
Points : 447
Points : 447
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 :
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>";
}
 
 
?>
kilian67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 15h43   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
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 :
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 :
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 16h08   #10
Membre éprouvé
 
Inscription : août 2007
Messages : 496
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2007
Messages : 496
Points : 447
Points : 447
Trop fort un grand merci votre code fonctionne

Celui la :

Citation:
// 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
Citation:
le
Citation:
la
Citation:
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
kilian67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 16h18   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Il faudrait tester ce qu'il "reste" via votre variable $nb avant même de faire la requête :
Code :
1
2
3
4
5
if (!$nb) {
    # Erreur à notifier
} else {
    # Suite normale
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 16h27   #12
Membre éprouvé
 
Inscription : août 2007
Messages : 496
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : août 2007
Messages : 496
Points : 447
Points : 447
Ok merci beaucoup

Pour moi le sujet est clos et résolu.

tout fonctionne a merveille
kilian67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h19.


 
 
 
 
Partenaires

Hébergement Web