regexp et terme exact

inuendo
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 22:49

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'...

Eléphant du PHP | 440 Messages

23 janv. 2006, 22:50

Hello ,

et si tu mets '=' tout simplement ?
C'est en faisant des erreurs et en osant demander de l'aide qu'on apprend ! Il n'est pas ridicule de ne pas savoir !

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 janv. 2006, 23:04

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 ]

inuendo
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 23:07

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

Eléphant du PHP | 440 Messages

23 janv. 2006, 23:23

et si tu fais

like %' jours '% (sans oublier les espaces autour de jour ?
C'est en faisant des erreurs et en osant demander de l'aide qu'on apprend ! Il n'est pas ridicule de ne pas savoir !

inuendo
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 23:30

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

inuendo
Invité n'ayant pas de compte PHPfrance

24 janv. 2006, 19:21

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% ?

inuendo
Invité n'ayant pas de compte PHPfrance

24 janv. 2006, 19:55

- 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...

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 00:02

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^^

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 01:17

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 ?)

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 01:35

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?)

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 13:37

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^^