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 :

Isoler une sous-chaîne ayant plusieurs délimitateurs possibles


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Par défaut Isoler une sous-chaîne ayant plusieurs délimitateurs possibles
    Bonjour,

    je cherche à extraire la sous-chaîne en gras dans une chaîne ayant cette forme :
    ... AB=sous chaine à extraire CD=... DE=... FG=...
    où ... sont évidemment variables et peuvent contenir des espaces
    et où CD= et DE= sont optionnels (sinon, ce serait trop facile)

    Je voulais exprimer quelque chose comme : CD=... ou DE= non précédé d'un CD=..., etc
    En cherchant un peu j'ai découvert les assertions arrières négatives, mais j'ai l'impression qu'on ne peut qu'exclure un motif assez simple avec, or ici je peux avoir à peu près n'importe quoi après CD=.

    Pour l'instant, je m'en suis sorti en appliquant plusieurs expressions régulières les unes à la suite des autres, pour éliminer les éventuels DE=..., puis CD=... récalcitrants, mais si quelqu'un connaît une solution plus élégante, ce serait intéressant !

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de Mitaka
    Profil pro
    formaTRICE en informatique
    Inscrit en
    Avril 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Par défaut
    Bonjour,
    pourrais tu mettre ton expression ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Par défaut
    Bonjour,

    voici l'expression :
    ^(.*)AB=(.*)(CD=){0,1}(.*)(DE=){0,1}(.*)FG=(.*)$

    Si CD=... ou DE=... sont présents dans la chaîne, ils se retrouvent dans la 2ème capture, ce que je voudrais éviter.

  4. #4
    Membre confirmé Avatar de Mitaka
    Profil pro
    formaTRICE en informatique
    Inscrit en
    Avril 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Par défaut
    t'as essayé cette expression ?
    je suis pas sûre que ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(.*)AB=(.*)(^[CD=]*)(^[DE=]*)FG=(.*)$
    ^[CD=] : veut dire "qui ne contient pas"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Par défaut
    Ca ne semble pas fonctionner. Tu essayes d'exclure "CD=" ? Je ne crois pas qu'on puisse, il me semble qu'on peut seulement exclure certains caractères, pas des chaînes, et le ^ n'a ce sens qu'à l'intérieur de crochets [ ].

  6. #6
    Membre confirmé Avatar de Mitaka
    Profil pro
    formaTRICE en informatique
    Inscrit en
    Avril 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Par défaut
    je sais que ça fonctionne ce genre de choses mais je me souviens plus exactement de l'expression régulière.

    oui il faut la mettre à l'intérieur des crochets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(.*)AB=(.*)([^CD=]+)([^DE=]+)FG=(.*)$
    autrement, tu peux ajouter "?:" pour qu'une expression entre parenthèses ne soit pas prise en compte :
    3) Les parenthèses capturantes... non-capturantes !
    Dans la mesure du possible, si vous ne devez pas capturer certaines parties de votre masque, rendez vos parenthèses (alternative) non capturante.
    Dans le masque de l'exemple ci-dessus, vous remarquerez que je l'ai fait grâce à ?:
    comme ceci : '`(p(?:a|i|o)f)`i'
    En faisant comme cela, vous allégez la charge de moteur de regex et vous rendez vos regex plus rapide.
    http://www.expreg.com/optimisation.php

Discussions similaires

  1. [MySQL] Incrémenter une sous-chaine le plus efficacement possible ?
    Par smrhp dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/06/2006, 16h58
  2. [Tableaux] Retrouver une sous chaîne.
    Par Huntress dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 16h31
  3. Réponses: 28
    Dernier message: 22/09/2005, 12h57
  4. Réponses: 9
    Dernier message: 18/08/2005, 14h16
  5. [String] Récupérer une sous -chaîne sans split
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2004, 15h45

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