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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 11
    Points
    11
    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 habitué Avatar de Mitaka
    Profil pro
    formaTRICE en informatique
    Inscrit en
    Avril 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : formaTRICE en informatique

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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 11
    Points
    11
    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 habitué Avatar de Mitaka
    Profil pro
    formaTRICE en informatique
    Inscrit en
    Avril 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Points : 178
    Points
    178
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 11
    Points
    11
    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 habitué Avatar de Mitaka
    Profil pro
    formaTRICE en informatique
    Inscrit en
    Avril 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Points : 178
    Points
    178
    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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Avec ça, on exclut les caractères C, D ou =, et non "CD=", donc si un C majuscule traîne dans la chaîne à capturer, ça va poser problème.

    Par contre je ne connaissais pas le ?:, je vais regarder ça, merci bien !

    EDIT : Euh non en fait, ça ne résout pas le problème, ce n'est pas fait pour exclure, par contre sur la même page on peut lire qu'il est préférable de privilégier plusieurs petites expressions régulières qu'une trop lourde. C'est la solution pour laquelle j'avais opté, et c'est peut-être donc bel et bien plus sage finalement.
    Mais j'aimerais bien savoir si c'est possible, quand même.

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

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par Aoyama Voir le message
    Avec ça, on exclut les caractères C, D ou =, et non "CD=", donc si un C majuscule traîne dans la chaîne à capturer, ça va poser problème.
    bon euh oui, je suis à la ramasse aujourd'hui désolée

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Je corrigeais juste pour ne pas te laisser dans l'erreur vu que tu as pris le temps de te pencher sur le problème, merci d'ailleurs.

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

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Points : 178
    Points
    178
    Par défaut
    salut
    pas de souci pour la correction. en fait j'ai regardé mon code et c'était juste pour un caractères que j'avais utilisé cette expression.
    par contre j'ai trouvé cet article, ça pourra peut être t'aider :
    http://www.lumadis.be/regex/tuto_pcre.php#look

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Je crois que j'avais déjà regardé de ce côté là, ça donnerait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:.*)AB=(.*)(?=CD=|DE=)(?:.*)
    Le problème c'est que si j'ai une chaîne avec un CD= et un DE=, il continue à capturer jusqu'au DE=, et je récupère le CD= dans la parenthèse capturante :-\

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

    Informations professionnelles :
    Activité : formaTRICE en informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 192
    Points : 178
    Points
    178
    Par défaut
    salut
    par contre cette expression fonctionne non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #(?:.*)AB=(.*)(?:CD=)(?:.*)#

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, 15h58
  2. [Tableaux] Retrouver une sous chaîne.
    Par Huntress dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 15h31
  3. Réponses: 28
    Dernier message: 22/09/2005, 11h57
  4. Réponses: 9
    Dernier message: 18/08/2005, 13h16
  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, 14h45

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