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 :

Détection de la fin d'une chaine de caractères [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut Détection de la fin d'une chaine de caractères


    je voudrais checker qu'une string dans ma table sal se termine bien par

    (

    un nombre

    /

    un nombre

    )


    je ne fais pas souvent des regexp mais bon, en dépoussiérant un peu j'arrive sur

    ^.*\([0-9]+/[0-9]+\)$

    mais bizarement on dirait qu'il faut ajouter un . juste avant le $ pour que ca marche:

    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
     
    mysql> SELECT "salut mon pote!!! (12/99)" RLIKE '^.*\([0-9]+/[0-9]+\).$' ;
    +------------------------------------------------------------+
    | "salut mon pote!!! (12/99)" RLIKE '^.*\([0-9]+/[0-9]+\).$' |
    +------------------------------------------------------------+
    |                                                          1 |
    +------------------------------------------------------------+
    1 row in set (0.00 sec)
     
    mysql> SELECT "salut mon pote!!! (12/99)" RLIKE '^.*\([0-9]+/[0-9]+\)$' ;
    +-----------------------------------------------------------+
    | "salut mon pote!!! (12/99)" RLIKE '^.*\([0-9]+/[0-9]+\)$' |
    +-----------------------------------------------------------+
    |                                                         0 |
    +-----------------------------------------------------------+
    1 row in set (0.00 sec)
     
    mysql>
    ma question : pourquoi ?

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Première piste : je n'utilise que peu les regex sous mysql, mais sous vi par exemple, une parenthèse capturante doit être échappée. Si elle ne l'est pas, le moteur la considère comme un caractère ( normal.

    Quid de mysql ?

  3. #3
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    euh...

    sous réserve que "parenthèse capturante" s'entende "je veux détecter une vraie parenthèse"...

    il me semble que pour détecter une parenthèse avec une regexp, il faut prefixer du caractère d'echappement \

    or dans les expressions

    '^.*\([0-9]+/[0-9]+\).$'

    et

    '^.*\([0-9]+/[0-9]+\)$'

    c'est le cas non ?

    enfin j'ai essayer sans le caractère \ avant la parenthèse et dans ce cas, la parenthèse est interprétée comme un symbole qui sert à séparer des éléments dans l'expression et non comme un caractère à chercher...

    pe je n'ai pas compris qqch dans ton msg s.n.a.f.u

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Que donne ces deux tests (pas de mysql sur mon poste)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT 'salut mon pote!!! (12/99)' RLIKE '\([0-9]+/[0-9]+\)$' ;
     
    SELECT 'salut mon pote!!! (12/99)' RLIKE '([0-9]+/[0-9]+)$' ;

  5. #5
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    @s.n.a.f.u :
    Les deux tests renvoient 0.

    @fourchette et s.n.a.f.u :
    J'ai également testé :
    SELECT "salut mon pote!!! (12/99)" RLIKE '^.*\([0-9]+/[0-9]+\)..$'
    qui renvoie 1.
    puis
    SELECT "salut mon pote!!! (12/99)" RLIKE '^.*\([0-9]+/[0-9]+\)...$'
    qui renvoie 0.
    Surprenant, non ?

    En revanche,
    SELECT "salut mon pote!!! (12/99)" RLIKE '^.*[(][0-9]+/[0-9]+[)]$' ;
    renvoie bien 1.
    Fred

  6. #6
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Il y a bien un problème avec l'échappement.

    Au passage, même si cela ne résoud pas le problème, il n'est pas bon de jongler entre quotes et guillemets pour délimiter les chaînes.
    Sauf obligation contraire, toujours utiliser les quotes.

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Tiré de cette page : http://dev.mysql.com/doc/refman/5.1/en/regexp.html

    Note

    Because MySQL uses the C escape syntax in strings (for example, “\n” to represent the newline character), you must double any “\” that you use in your REGEXP strings.
    Donc je tenterais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'salut mon pote!!! (12/99)' RLIKE '\\([0-9]+/[0-9]+\\)$' ;

  8. #8
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Tiré de cette page : http://dev.mysql.com/doc/refman/5.1/en/regexp.html



    Donc je tenterais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 'salut mon pote!!! (12/99)' RLIKE '\\([0-9]+/[0-9]+\\)$' ;
    Et ça marche.
    Bravo !

    Fred

  9. #9
    Membre habitué

    Inscrit en
    Février 2004
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 342
    Points : 197
    Points
    197
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Au passage, même si cela ne résoud pas le problème, il n'est pas bon de jongler entre quotes et guillemets pour délimiter les chaînes.
    => et ben précisément si, ca résoud le pb non ?

    je n'ai pas de mysql sous la main là tt de suite, je vais tester ca bientot.

    cela dit... si ca se confirme de mon coté, cette mésaventure sera un enieme rappel que parfois les bonnes habitudes permettent de s'éviter bien des tracas

    enfin bon, c'est aussi avec des habitudes qu'on devient un angry monkey... mais bon je digresse

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/01/2011, 13h46
  2. [XL-2003] Placer automatiquement un caractère à la fin d'une chaine de caractère
    Par pomdeterfrite dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/11/2010, 11h00
  3. Réponses: 5
    Dernier message: 02/12/2009, 00h27
  4. [Regex] effacer la fin d'une chaine de caractère
    Par pourquoipasmoi dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 29/07/2009, 14h06
  5. Enlever la fin d'une chaine de caractères
    Par snyfir dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2008, 17h41

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