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 et chiffre latin [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut regex et chiffre latin
    Bonjour à tous,

    Je termine actuellement mon site qui a pour thème l'histoire. J'ai créé un moteur de recherche dessus qui tourne très bien mais sur lequel j'ai un problème. Lorsque je tape des mots de plus de 4 lettres ma recherche est impeccable et rapide par contre j'ai un problème sur mes recherches concernant les rois de France. On les exprime toujours de la façon suivante : Charles X ou Henry IV etc....
    Et la forcement il ne prend pas en compte le X ou le IV et donc mon résultat devient nul.
    A force de chercher je m'oriente peu à peu sur les regex dont je viens de finir de lire le tuto sur le site. Mon problème est comme je suis totalement nul sur ce sujet je suis perdu.
    Je n'ai rien trouvé (il me semble) qui me permettrait de dire si par exemple il existe "charles X" conserver la totalité de la chaine de caractère dans ma recherche lors de ma requête SQL.

    Pour être plus clair voici un exemple :

    charles I = mauvais résultat
    charles II = mauvais résultat
    charles III = mauvais résultat
    charles IV = mauvais résultat
    charles V = mauvais résultat
    charles VI = mauvais résultat
    charles VII = mauvais résultat
    charles VIII = BON RESULTAT (4 caractères)
    charles IX = mauvais résultat
    charles X = mauvais résultat


    Si quelqu'un pouvait me donner quelques conseils cela me serait très utile.

    Merci beaucoup d'avance.

    Astroma

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Points : 163
    Points
    163
    Par défaut
    En principe, si tu fais une requete dans ta base de données pour rechercher les rois de France.

    Je pense que si tu fais cette requete, ça devrait fonctionner, peu importe, si il y a 1 ou plusieurs chiffres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_roi FROM rois WHERE nom_roi LIKE "%VI%;
    Si on n'ose pas poser des questions bêtes, on le restera.


    Une recherche Google résoudra bien 60% de vos problèmes.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    effectivement mais ma requete est un peu plus compliqué et elle fait exactement ce que je veux grace à l'utilisation de match et against. Mais c'est la réponse pour laquelle les chaine de 3 caractères et moins ne sont pas prisent en compte. La voici pour info.
    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
    18
    19
    20
    21
    22
    23
    <?php
    $resultats=$connexion->prepare("
    SELECT
    h_ev, h_id, h_dt1, h_dt2, h_lieu, h_src, h_srl,h_lat, h_long,
    v_nom, v_py,
    o_ad, o_tel, o_ml, o_fx, o_sit,
    m_nom, m_ad, m_dcrpt, m_aut, m_per,
    mu_nom, mu_ad, mu_st, mu_tel,
    t_ev, t_ad, t_dcrpt, t_cr, t_pe, t_o, t_oad, t_otl, t_ofx, t_m, t_mad, t_mo, t_mf, t_s, t_p1, t_p2, t_p3,
    (MATCH (h_ev) AGAINST ('$chercher') + MATCH (h_lieu) AGAINST ('$chercher')) as score
    FROM historique
    INNER JOIN ville on historique.h_ins = ville.v_ins
    LEFT JOIN office on historique.h_ins = office.o_ins
    LEFT JOIN mh on historique.h_lieu = mh.m_nom 
    LEFT JOIN musee on historique.h_ins = musee.mu_ins
    JOIN textes
    WHERE 
    MATCH (h_ev) AGAINST ('$chercher') OR MATCH (h_lieu) AGAINST ('$chercher')
    ORDER BY score DESC
    LIMIT 0,100
    ");
    $resultats->execute();
    ?>
    Astroma

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Points : 163
    Points
    163
    Par défaut
    Donc si je comprend bien le résultat de ta requete te retournent bien ceux que tu recherches.
    Si on n'ose pas poser des questions bêtes, on le restera.


    Une recherche Google résoudra bien 60% de vos problèmes.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut Sauf dans le cas des chiffres latin
    Sauf pour les rois de France avec les chiffres latin.

    Car la requete avec match against bien que plein d'avantage m'éjecte les chaine de moins de 4 caractères. Ce qui me pose problème juste dans le cas des noms avec chiffre latin.

    Je voudrais donc forcer la requete a prendre "charles X" comme une chaine unique si c'est possible.

    Merci d'avoir répondu.

    Astroma

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Points : 163
    Points
    163
    Par défaut
    Et si tu changes ta requete comme celle ci, ça sera pas mieux?

    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
    18
    19
    20
    21
    22
    23
    <?php
    $resultats=$connexion->prepare("
    SELECT
    h_ev, h_id, h_dt1, h_dt2, h_lieu, h_src, h_srl,h_lat, h_long,
    v_nom, v_py,
    o_ad, o_tel, o_ml, o_fx, o_sit,
    m_nom, m_ad, m_dcrpt, m_aut, m_per,
    mu_nom, mu_ad, mu_st, mu_tel,
    t_ev, t_ad, t_dcrpt, t_cr, t_pe, t_o, t_oad, t_otl, t_ofx, t_m, t_mad, t_mo, t_mf, t_s, t_p1, t_p2, t_p3,
    (MATCH (h_ev) AGAINST ('$chercher') + MATCH (h_lieu) AGAINST ('$chercher')) as score
    FROM historique
    INNER JOIN ville on historique.h_ins = ville.v_ins
    LEFT JOIN office on historique.h_ins = office.o_ins
    LEFT JOIN mh on historique.h_lieu = mh.m_nom 
    LEFT JOIN musee on historique.h_ins = musee.mu_ins
    JOIN textes
    WHERE 
    h_ev LIKE "%'$chercher'%"
    ORDER BY score DESC
    LIMIT 0,100
    ");
    $resultats->execute();
    ?>
    Si on n'ose pas poser des questions bêtes, on le restera.


    Une recherche Google résoudra bien 60% de vos problèmes.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    Et d'après toi si je fais ça ce sera quoi mon résultat. Sans doute une belle division par zero car la requete ne vas pas pouvoir prendre en compte le where pour le calcul des résultats.

    J'essaye mais je suis certain de mon fais

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut C'est bien ça.
    Division par 0 donc je perd mon classement si je passe par like

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Points : 163
    Points
    163
    Par défaut
    Autant pour moi, j'avais lu à moitié ta requete...

    Sinon il y a cette regex qui va te trouver les chiffres latins, mais je n'arrive pas à voir comment tu vas l'appliquer car si ta requête ne renvoit pas de résultats.

    Et aucune fonction modifie la variable $chercher?



    Si on n'ose pas poser des questions bêtes, on le restera.


    Une recherche Google résoudra bien 60% de vos problèmes.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Juillet 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant communication & réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 43
    Points : 39
    Points
    39
    Par défaut regex
    Et non aucune fonction ne modifie ma variable $chercher. Je cherche juste a tranformer
    string chiffre latin en chaine complete

  11. #11
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Tu as regardé du côté de la pertinence des résultats ...

    Pour ton code en light (j'ai pris juste la partie sur les nom de roi si h_ev)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select  h_ev, ...., (MATCH (h_ev) AGAINST ('$chercher')
    from historique 
    innerjoin ....
    ....
    WHERE  (MATCH (h_ev) AGAINST ('$chercher')) > 0 ORDER BY date DESC
    Ou avec le score en alias tu prends score>0

    Autre chose aussi si charles VIII et Ok car 12 car et tous les autres donc < 12 ne sont pas matché, tu n'as pas un problème dans la conf de Mysql avec l'option 'ft_min_word_len' qui représente le nombre de caractères au minimum pour être matché ... voir dans le fichier my.cnf
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

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

Discussions similaires

  1. [RegEx] Regex pour chiffres uniquement
    Par EIN-LESER dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2014, 11h29
  2. [RegEx] Regex 3 chiffres
    Par je-suis-moi dans le forum Langage
    Réponses: 6
    Dernier message: 18/01/2009, 06h33
  3. [RegEx] Regex pour récupérer une chaîne de 6 chiffres
    Par calitom dans le forum Langage
    Réponses: 5
    Dernier message: 12/06/2008, 21h37
  4. [RegEx] Regex trouvé des chiffres entre parenthèse
    Par narayana_seb dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2007, 19h51
  5. regex pour comparer des dates, des chiffres, des nombres
    Par lex13 dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 06/07/2007, 11h51

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