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 :

[RegExp] chaine operateur valeur


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : août 2003
    Messages : 577
    Points : 652
    Points
    652
    Par défaut [RegExp] chaine operateur valeur
    Bonjour à tous,
    je galère un peu sur une expression régulière.
    Je ne suis pas loin, mais il me manque encore quelque chose.

    Je cherche à analyser une chaîne du type : --chaine operateur valeur
    Exemples :
    --username=nako
    --user_id>=36
    --end_date<"2006-08-11"

    Pour l'instant, j'ai l'expression régulière suivante, qui me permet de capturer 1) la clé, 2) l'opérateur (<, >, <=, >=, <>, =) et la valeur (n'importe quoi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (preg_match("/^\\-\\-(.+)(<=|<>|>=|=|<|>)(.+)/",$key_operator_value,$res))
    Problème : ça marche très bien pour les opérateur de longueur 1 mais ça ne marche pas pour <= et >=.

    Exemple :
    --detail>=toto
    va me donner
    1) detail>
    2) =
    3) toto

    Alors que je souhaiterais
    1) detail
    2) >=
    3) toto

    Vous voyez où ça cloche ?
    Merci d'avance,
    Nako.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2005
    Messages : 657
    Points : 895
    Points
    895
    Par défaut
    Salut,

    Quand tu donnes une expression comme (.+), on dit qu'elle est gourmande (greedy), c'est à dire qu'elle essaye de capturer le maximum de caractères possibles.
    Dans ton cas je vois 2 solutions :

    - Soit tu restreins les caractères possible pour chaine aux caractères alphanumériques uniquement (plus éventuellement _, - et autre) :
    if (preg_match("/^\\-\\-([a-zA-Z_-]+)(<=|<>|>=|=|<|>)(.+)/",$key_operator_value,$res))

    - Soit tu rends ton expression pour capturer chaine non gourmande :
    if (preg_match("/^\\-\\-(.+?)(<=|<>|>=|=|<|>)(.+)/",$key_operator_value,$res))
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2004
    Messages : 1 249
    Points : 1 539
    Points
    1 539
    Par défaut
    Autre possibilité (mais beaucoup moins propre que la 2eme de Taum je trouve) :

    remplacer le premier (.+) par :
    remplacer le dernier (.+) par :
    ce qui va forcer le dernier caractere de chaine a ne pas etre un operateur
    et va forcer le premier caractere de valeur a ne pas etre un operateur

  4. #4
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : août 2003
    Messages : 577
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par Taum
    - Soit tu rends ton expression pour capturer chaine non gourmande :
    if (preg_match("/^\\-\\-(.+?)(<=|<>|>=|=|<|>)(.+)/",$key_operator_value,$res))
    Salut et merci pour vos réponses.
    Cette solution me plaît beaucoup et semble marcher sur les quelques tests que j'ai pu faire ... mais je ne comprend pas ce que ça fait ...
    Le "?" signifie juste "ne pas être gourmand" ?
    Ou c'est plus compliqué que ça ?
    Merci.
    Nako

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2004
    Messages : 1 249
    Points : 1 539
    Points
    1 539
    Par défaut
    oui, "?" inverse la tendance a la gourmandise de l'operateur précédent, ici "+"

  6. #6
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : août 2003
    Messages : 577
    Points : 652
    Points
    652
    Par défaut
    Ok, merci beaucoup.
    Non seulement le problème est résolu, mais en plus, j'ai compris pourquoi !
    Bon week-end !
    a+

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

Discussions similaires

  1. regexp chaine avec des quotes
    Par Alkhan dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 25/08/2008, 10h40
  2. [regexp] chaine la plus courte
    Par unameno dans le forum Langage
    Réponses: 2
    Dernier message: 25/03/2008, 11h37
  3. [regexp] Chaine qui se termine par
    Par cootchy dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/08/2007, 18h39
  4. RegExp: Récupérer une valeur en début de chaine
    Par pekka77 dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2006, 16h07
  5. Réponses: 11
    Dernier message: 29/11/2005, 16h01

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