Page 1 sur 1

regexp et terme exact

Posté : 23 janv. 2006, 22:49
par inuendo
Bonjour,

j'expose ce sur quoi je bute :

Je voudrais que ma requête ne renvoie que les lignes contenant le mot 'jour' dans une chaine de caractères. Donc, je ne veux pas qu'elle me renvoie les lignes comportant les mots 'journées' 'journée' 'ajourner', etc.

J'ai lu sur le forum une personne qui proposait de remplacer LIKE par REGEXP 'jour' par exemple. Mais cela ne marche pas. Ai-je mal compris ?
include( "mysql.inc.php" );
$requete    = "SELECT * FROM `japfr` WHERE fr REGEXP 'Psy'";
    $execution  = mysql_query( $requete, $connection );
$nombre = mysql_num_rows($execution); 
	
	if ($nombre==0){
echo "aucune traduction";
}
else 
	while ( $result=mysql_fetch_array( $execution) ) 
{

echo $result["jap"] .$result["fr"];
echo "<br />";
} 
Donc si j'ai bien compris, ça ne devrait me renvoyer que 'psy' ? Mais, cela me trouve tous les mots comportant 'psy'...

Posté : 23 janv. 2006, 22:50
par DarkBlue
Hello ,

et si tu mets '=' tout simplement ?

Posté : 23 janv. 2006, 23:04
par Hubert Roksor
En fait il souhaite les textes contenant ce mot.

inuendo, ce que tu recherches est là: [ Recherche en texte intégral (Full-text) dans MySQL ]

Posté : 23 janv. 2006, 23:07
par inuendo
Merci à tous les deux.

Effectivement, si je mets égal, je n'aurai pour ligne que le mot indiqué ainsi :

si je mets where voca='jour'

Je n'aurai que la ligne qui contient le mot jour

Mais pas la ligne : le jour se lève.

Je regarde le lien Huber Roksor

Posté : 23 janv. 2006, 23:23
par DarkBlue
et si tu fais

like %' jours '% (sans oublier les espaces autour de jour ?

Posté : 23 janv. 2006, 23:30
par inuendo
J'ai pas l'impression que ça marche...

REGEXP, ça ne permet pas de trouver le mot exact dans la chaîne de caractère ?

Sinon, fulltext, ça peut y ressembler mais faut que je comprenne :-k

Posté : 24 janv. 2006, 19:21
par inuendo
Alors après tentatives, le fulltext semble être ce qui correspond le plus à ce que je cherche !

Cependant quelques problèmes :

- les accents non pas l'air d'être pris en compte. Ainsi, si je cherche le mot 'jour', il me renverra le mot 'séjour' ??

- Est-il possible de garder la fonction de pertinence de résultat mais de permettre %mot% ?

Posté : 24 janv. 2006, 19:55
par inuendo
- Est-il possible de garder la fonction de pertinence de résultat mais de permettre %mot% ?
La réponse est oui !

Il suffit de mettre IN BOOLEAN MODE dans la requête puis de choisir parmi les différentes options !

Reste le problème de l'accentuation...

Posté : 25 janv. 2006, 00:02
par inuendo
Salut,

alors suite à ma découverte de FULLTEXT, je suis arrivé à ce genre de requête SQL qui répond pas mal à mes attentes :

Code : Tout sélectionner

SELECT champs1,champ2, champ3, MATCH (champ1,champ2) AGAINST ('motcherché') AS score FROM table WHERE MATCH (champ1,champ2) AGAINST('motcherché*' IN BOOLEAN MODE) ORDER BY score DESC
Le seul souci que je rencontre est lié à l'accentuation :

Si je tape le mot journée, il me renvoie des réponses qui n'ont rien à voir avec le mot journée. Et dès qu'il y a un accent en général, ça ne marche plus. Cela marche normalement avec un LIKE. Est-ce inhérent à la fonction ?
Devrais-je appliquer un htmlentities ('','', UTF-8) ??
J'ai voulu passer à php1.8 mais j'avais un problème d'affichage des caractères asiatiques (import de la table en latin1, ça marche, si je change en utf-8, je lis les données dans la table mais j'ai ??? sur le site)

Une idée ? Merci^^

Posté : 25 janv. 2006, 01:17
par inuendo
Ah aussi, si j'enlève la fonction booléenne, ça marche 'presque' correctement :

Pour le mot jour, il va quand même me mettre séjour et pour le mot séjour, il va m'inclure les mots jour !

j'ai l'impression qu'il considère le é comme un % ou un espace vide (pourquoi séjour pour la recherche du mot jour ?)

Posté : 25 janv. 2006, 01:35
par inuendo
Bon, j'ai trouvé mais c'est pas très logique comme méthode :

html_entity_decode($critere, ENT_COMPAT, 'ISO8859-1')

En fait, mes données sont censées être en UTF-8 (je dis bien censé parce que je n'en suis plus sûr quand je vois ça... latin1?)

Posté : 25 janv. 2006, 13:37
par inuendo
Argh...

Bon, ça marche à peu près pour le français mais pas pour les caractères asiatiques ! Il va directement à la fin de mon code est écrit : pas de résultat pour *mot* (qui pourtant apparaît correctement sur la page)

Code : Tout sélectionner

SELECT champs1,champ2, champ3, MATCH (champ1,champ2) AGAINST ('motcherché') AS score FROM table WHERE MATCH (champ1,champ2) AGAINST('motcherché*' IN BOOLEAN MODE) ORDER BY score DESC
Cette requête ne marche pas avec les caractères asiatiques. Un LIKE en revanche marche !

Mais bon, c'est peut-être plus de l'ordre de MySQl, je ne suis peut-être pas là où il faudrait en fait^^