[résolu] mysql et regexp

  • Auteur de la discussion Auteur de la discussion e-kiwi
  • Date de début Date de début
WRInaute accro
bonjour,

j'ai une table article avec deux champs : art_titre et art_texte
j'ai un nom de société $ent_nom

je cherche à trouver dans ma table article les articles qui citent cette société. pour cela , je recherche la chaine de caractere ent_nom dans mon art_titre et art_texte, mais en ignorant les articles dans lequel ma chaine est précédé ou suivie d'un caractere compris entre A et Z (pour, par exmple, si j'ai une société qui s'appelle CCI, que cela ne me ressorte pas un article contenant le mot "accident")

ma requete est :
$requete2="select * from articles where (art_titre like \"%$ent_nom%\" and art_titre NOT REGEXP \"[a-z]".$ent_nom."[a-z]\") or (art_texte like \"%$ent_nom%\" and art_texte NOT REGEXP \"[a-z]".$ent_nom."[a-z]\")";

vous semble-t-elle correcte ?
 
WRInaute discret
Bonjour,
et si tu met un espace dans le like : like \"% $ent_nom %\" ?
Tu n'aurais plus besoin des regexp..
Non?
 
WRInaute impliqué
siddhy a dit:
Bonjour,
et si tu met un espace dans le like : like "% $ent_nom %" ?
Tu n'aurais plus besoin des regexp..
Non?

like "% $ent_nom %" or like "$ent_nom %" or like "% $ent_nom"

couvre presque toutes les éventualités.

Sinon en théorie tu peux utiliser \w (caractère de mot), \W (pas de caractère de mot), plutôt que NOT REGEXP, ou bien ^\w+ qui marchent bien en php (j'ignore si ça fonctionne pour mysql).
 
WRInaute accro
siddhy et Tilt, ca n'est pas bon :)

siddhy, c'est écrit dans mon message :
>> si j'ai une société qui s'appelle CCI, que cela ne me
>> ressorte pas un article contenant le mot "accident"

Tilt> il suffit que la chaine commence le mot ou le termine et ca ne marches pas

mais c'est bon, j'ai trouvé ce qui marche TOUT LE TEMPS :
$requete2="select * from articles where (art_titre like \"%$ent_nom%\" and art_titre NOT REGEXP \"[a-z]".$ent_nom."[a-z]\" and art_titre NOT REGEXP \"".$ent_nom."[a-z]\" and art_titre NOT REGEXP \"[a-z]".$ent_nom."\") or (art_texte like \"%$ent_nom%\" and art_texte NOT REGEXP \"[a-z]".$ent_nom."[a-z]\" and art_texte NOT REGEXP \"".$ent_nom."[a-z]\" and art_texte NOT REGEXP \"[a-z]".$ent_nom."\")";
 
WRInaute discret
Salut,
Justement, ma réponse empêchait d'avoir "accident"...
Par contre si CCI était en début ou en fin, ça ne le prenait pas en compte..
 
WRInaute accro
ah oui je n'avais aps vu les espaces. mais l'autre problème etait effectivement d'actualité. enfin ma moulinette tourne, dans 55mn j'aurai la réponse ^^
 
WRInaute discret
Par contre il me semble que la réponse de Tilt n'était pas mauvaise..

Tilt a dit:
like "% $ent_nom %" or like "$ent_nom %" or like "% $ent_nom"

like "% $ent_nom %" pour les chaines au milieu
like "$ent_nom %" pour les chaines au début
like "% $ent_nom" pour les chaines en fin

Manque plus que le Pb de la ponctuation (par ex :virgule après ta chaine ou point ou ...) a traiter

(ça serait peut être plus rapide ?)

Bon, tu nous tiens au courant pour ta requête ? (dans 42 mn...)
 
WRInaute accro
il manque pleins de caracteres :

( ) , ; : ! ? ...

ma méthode inverse (dire tout ce qui n est pas caractere me semble bien plus précise)
 
WRInaute discret
Oui tu doit avoir raison..
Par contre tu as pensé aux majuscules ? ou les regexp de mysql ne tiennent pas compte de la casse?
 
WRInaute accro
les articles sont ecrits par les journalistes, donc ca va, ils mettent toujours la majuscule en début de nom de société :)

moulinette fini (plus rapide que prévu) résultat tres convenable :)
 
Discussions similaires
Haut