IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Regex, sélection d'un champ contenant x mots parmi une liste définie [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut Regex, sélection d'un champ contenant x mots parmi une liste définie
    Bonsoir,

    J'ai une liste de mots définie, avec REGEXP, je voudrais sélectionner les lignes de ma table qui contiennent au moins x mots parmi cette liste et ceci peu importe le nombre d'occurences de chaque mot pourvu qu'il y soit au moins une fois, et ceci dans une seule regex(pas autant de regex qu'il n'y a de combinaisons de mots)

    Par exemple, j'ai une liste "a, b, c, d, e", je voudrais que si mon champ contient:

    (a et b et c et d) ou (a et b et c et e) ou (a et b et d et e), etc...
    Donc 4 termes distinct parmi cette liste, que la ligne soit sélectionnée.

    Par contre si mon champ contenait "a b a c", celle-ci ne devrait pas être sélectionnée, puisque il n'y a que 3 valeurs différentes.

    Je sais pas si je suis bien clair

    J'ai tenté plein de chose, mais pas de résultats corrects à chaque fois.

    J'ai également un problème avec les caractères qui ne sont pas de mots que je n'arrive pas à intégrer dans une classe de caractères, mais ce sera pour plus tard

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    pourquoi utiliser des REGEXP ? est-ce que, LIKE ou FIND_IN_SET ne te suffiraient pas ?

    Je te propose deux solutions que j'illustre avec REGEXP, mais qui sont adaptables à LIKE ou FIND_IN_SET.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    -- solution "bricolage booléen"
    SELECT champ
    FROM table_textes
    WHERE (champ REGEXP 'a') 
    + (champ REGEXP 'b') 
    + (champ REGEXP 'c') 
    + (champ REGEXP 'd') 
    + (champ REGEXP 'e') >= 4
     
    -- solution avec table Thesaurus contenant tes mots-clés possibles
    SELECT champ
    FROM table_textes Tx
      INNER JOIN Thesarus Th ON Tx.champ REGEXP Th.motcle
    WHERE  Th.motcle IN ('a', 'b', 'c', 'd', 'e')
    GROUP BY champ 
    HAVING COUNT(*) >= 4
    EDIT : j'ai rajouté des parenthèses dans mon "bricolage boolén"

  3. #3
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Merci, mais le problème avec LIKE, c'est qu'un mot peut-être contenu dans un autre.

    Je pourrais mettre des espaces, du genre LIKE '% clef %'
    Mais pour un mot en début/fin de chaine, ça poserait problème, et également avec les caractères de ponctuations.

    En fait, le but est de pouvoir approfondir une recherche en cas de résultat nul après une recherche en FULLTEXT, et également sur des champs en CHAR ou VARCHAR.

    Et donc je souhaite utiliser ceci afin d'essayer de faire un classement par pertinence, donc si l'utilisateur indique 4 mots, que les résultats retournés soit classés.

    1- champs contenant les 4 mots (pas dur)
    2- champs contenant 3 mots sur les 4
    3- champs contenant 2 mots sur les 4
    4- champs contenant 1 des 4 mots

    C'est sans doute plus clair

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Citation Envoyé par Xunil
    En fait, le but est de pouvoir approfondir une recherche en cas de résultat nul après une recherche en FULLTEXT, et également sur des champs en CHAR ou VARCHAR.
    Si tu cherches des mots, MATCH... (...IN BOOLEAN MODE) me semblerait pourtant suffisant et le + simple. Le BOOLEAN MODE indique un calcul de pertinence sur le mode "un point par mot-clé trouvé".

    Citation Envoyé par Xunil
    Et donc je souhaite utiliser ceci afin d'essayer de faire un classement par pertinence, donc si l'utilisateur indique 4 mots, que les résultats retournés soit classés.

    1- champs contenant les 4 mots (pas dur)
    2- champs contenant 3 mots sur les 4
    3- champs contenant 2 mots sur les 4
    4- champs contenant 1 des 4 mots

    C'est sans doute plus clair
    Pour calculer cette pertinence, tu peux utiliser ou mon "bricolage booléen", ou le COUNT(*) avec une table Thesaurus.

  5. #5
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Question sans doute con, mais une table thesaurus, c'est quoi ?

    C'est une table temporaire contenant les mots à rechercher, c'est ça ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Citation Envoyé par Xunil
    une table thesaurus, c'est quoi ?

    C'est une table temporaire contenant les mots à rechercher, c'est ça ?
    Ça pourrait être ça. Dans mon idée, c'était plutôt une table normale contenant l'ensemble des mots-clés potentiellement cherchables (ça ne s'applique pas à tous les cas !).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Champ selectionné par défaut d'une liste déroulante = vide
    Par cari dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/07/2006, 20h03
  2. Réponses: 6
    Dernier message: 17/07/2006, 13h56
  3. Réponses: 1
    Dernier message: 06/06/2006, 14h54
  4. Réponses: 7
    Dernier message: 24/01/2006, 11h03
  5. Réponses: 1
    Dernier message: 16/01/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo