PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 16-05-2010 23:41:16

chsepa
Membre
Inscription : 12-11-2009
Messages : 2

Extraire d'un champ texte seulement la phrase contenant le mot clé

Bonjour,

Je galère et j'aurais besoin d'aide pour construire ma requête SQL. J'ai sur mon site un petit moteur de recherche permettant aux visiteurs d'entrer un mot et de voir s'afficher les pages du site contenant ce mot. Je voudrais n'afficher dans la page résultats que la phrase contenant ce mot et non l'intégralité du champ texte, parfois fort long.

J'imagine bien qu'il faut utiliser INSTR() pour localiser la position du mot en question et SUBSTR() pour extraire la chaîne, mais je ne sais pas comment les combiner, ni comment en récupérer le résultat, ni comment trouver le point précédent l'occurence du mot et celui suivant l'occurence du mot afin d'extraire une phrase complète. J'ai essayé tellement de choses que je suis découragée et je mélange tout. Si quelqu'un peut m'aider, ce serait top !

Voilà la requête qui extrait la totalité du champ 'fr'

$sql = "SELECT * FROM wp_contenus WHERE `fr` LIKE '%$box_mot_cle%' ORDER BY `page` ASC ";

merci merci merci !!!

Hors ligne

#2 17-05-2010 14:18:47

Sergnal
Membre
Inscription : 17-06-2009
Messages : 38

Re : Extraire d'un champ texte seulement la phrase contenant le mot clé

Bonjour,

SELECT
SUBSTR (`fr`,
-(LOCATE('.',REVERSE(`fr`),LOCATE(REVERSE('$box_mot_cle'),REVERSE(`fr`))))+1,
LOCATE('.',
SUBSTR(`fr`,
-(LOCATE('.',REVERSE(`fr`),LOCATE(REVERSE('$box_mot_cle'),REVERSE(`fr`))))+1)))
FROM `wp_contenus`
WHERE `fr` LIKE '%$box_mot_cle%'

Bon c'est très fouilli, très brouillon, ça ne marchera sans doute que sous MySQL et je pense qu'il y avait plus simple... mais ça marche ^^

La logique est simple,  pour aller chercher le point après le mot-clef on fait

LOCATE('.',`fr`,LOCATE('$box_mot_cle',`fr`))

c'est-à-dire qu'on cherche le mot clef puis le point qui se trouve après.

Donc pour aller chercher celui qui se trouve avant c'est

LOCATE('.',REVERSE(`fr`),LOCATE(REVERSE('$box_mot_cle'),REVERSE(`fr`)))

c'est-à-dire qu'on se contente de tout inverser.

Bon c'est très bien mais on a notre position à partir de la fin... bah SUBSTR peux prendre des valeurs négatives comme deuxième argument (il les compte à partir de la fin, ça tombe bien c'est juste ce qu'il nous faut), il nous suffit donc de mettre notre valeur précédente en négatif (et on rajoute 1 pour pas prendre le point).

SUBSTR (`fr`,-(LOCATE('.',REVERSE(`fr`),LOCATE(REVERSE('$box_mot_cle'),REVERSE(`fr`))))+1)

Impec, y'a plus qu'à indiquer en troisième argument de SUBSTR le nombre de caractère qu'il doit prendre, donc le nombre de caractère jusqu'au prochain point... donc le premier point de la chaine qu'on vient de récupérer (argh !)

LOCATE('.',SUBSTR(`fr`,-(LOCATE('.',REVERSE(`fr`),LOCATE(REVERSE('$box_mot_cle'),REVERSE(`fr`))))+1))

Ca fait bien long tout ça, mais bon, on rajoute ça en argument au premier SUBSTR et paf ça marche !

Voilà bon courage (et si d'autres membres ont un code moins long qu'ils n'hésitent pas).

Dernière modification par Sergnal (17-05-2010 14:23:18)

Hors ligne

#3 17-05-2010 23:16:18

chsepa
Membre
Inscription : 12-11-2009
Messages : 2

Re : Extraire d'un champ texte seulement la phrase contenant le mot clé

Trop bien !!! ça maaarche !!!
J'ai ajouté un alias après le SUBSTR, juste avant le 'FROM wp_contenus' pour pourvoir récupérer le contenu de SUBSTR et ça fonctionne !

Merci mille fois Sergnal d'avoir pris le temps de m'expliquer tout ça !...j'étais bien loin de la solution !:):):)

Hors ligne

#4 18-05-2010 08:50:17

Sergnal
Membre
Inscription : 17-06-2009
Messages : 38

Re : Extraire d'un champ texte seulement la phrase contenant le mot clé

Tout le plaisir est pour moi ^^

Hors ligne

#5 18-05-2010 14:51:18

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Extraire d'un champ texte seulement la phrase contenant le mot clé

Saluton,
Ça fait bien des calculs côté SGBD, je pense que récupérer la totalité des colonnes `fr` qui vérifient le LIKE et leur passer un coup de regexp à l'arrivée en PHP, serait moins gourmand.
Encore faut-il écrire l'expression rationnelle idoine, mais je ne m'y risquerais pas.:P


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#6 18-05-2010 15:43:01

Sergnal
Membre
Inscription : 17-06-2009
Messages : 38

Re : Extraire d'un champ texte seulement la phrase contenant le mot clé

Moi non plus, mais en php il existe les fonctions strpos(), strrev() et substr() qui devraient permettre de faire exactement la même chose que le SQL ^^

Ceci dit je suis d'accord sur le fait qu'une seule regex serait plus efficace que cet imbroglio de fonctions.

Hors ligne

Pied de page des forums