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 antislash [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Par défaut Regex et antislash
    Bonjour,

    Je viens de faire une recherche sur le forum, et sur Google, mais ça fait deux jours que je sèche, et que je ne trouve pas de solutions !

    Je cherche à faire une petit parser LaTeX Beamer en php. Dans un premier temps, je voudrais récupérer toutes les lignes commençant par un "\" (antislash), mais je n'y arrive pas. J'utilise la fonction preg_match_all.

    Ainsi, je ne comprends pas pourquoi lorsque ceci :
    preg_match_all("/\\(.*)/", $string, $res, PREG_SET_ORDER);
    me renvoie un tableau vide dans $res, alors que mon $string contient bien des lignes commençant par exemple par "\frame{"

    De plus malgré toutes les explications que je trouve sur les regex, j'ai beaucoup de mal à comprendre les délimiteurs. Quelqu'un pourrait-il m'expliquer la différence entre :
    preg_match_all("/\\(.*)/", $string, $res, PREG_SET_ORDER);
    preg_match_all("#\\(.*)#", $string, $res, PREG_SET_ORDER);
    preg_match_all("#\\(.*)#U", $string, $res, PREG_SET_ORDER);
    preg_match_all("#\\(.*)#s", $string, $res, PREG_SET_ORDER);

    EDIT : Je viens de trouver un super tutoriel sur les regex ( http://www.lumadis.be/regex/tuto_pcre.php )explicant les options des délimiteurs, mais quelle est la différence entre les deux premiers ? (entre / et # ?)

    Merci d'avance pour d'éventuelles réponses ! (et désolé si j'ai posté dans le mauvais forum, je ne savais pas trop où poster...)

  2. #2
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Le problème c'est que pcre interprète le pattern comme étant '\(.*)', d'où un problème de parenthèses non balancées.

    Ce pattern va choper tout ce qui suit le caractère '\' en début de ligne et sans capturer les commentaires en latex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/^\\\((?:(?!\s*%%).)+)/m', $string, $res, PREG_SET_ORDER);
    Il n'y a pas de différences entre un délimiteur '/' ou '#'. pcre va juste considérer le 1er caractère rencontré comme étant le délimiteur du pattern dans le seul but de pouvoir reconnaître les éventuels modifieurs situés après. Il faut donc qu'il n'y ait pas d'ambiguité

    Délimiteur #, modifieur U (Ungreedy)
    Pas correct: Délimiteur #, modifieur U (Ungreedy)
    Correct: Délimiteur /, modifieur U (Ungreedy)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Par défaut
    MERCI BEAUCOUP !!! Après deux jours de galère je vais pouvoir avancer dans ce projet (devoir) !
    Et merci pour les explications

    Et sans vouloir abusé, est-il possible de récupérer ce qu'il y a dans un motif de ce genre :
    \frame{ récupérer tout ce qu'il y a là dedans } sachant qu'il peut y avoir des antislash et des accolades fermantes à l'intérieur ?

  4. #4
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $r = '/^\\\([^{%\n]+) 
          (?: 
           (?(?={)(\{((?>[^{}]+)|(?2))*\})) (?2)* #(?2)* optionnel
           | (?(?=%)(?=%%)|(?3))
          )+/xm';
    preg_match_all($r, $string, $res, PREG_SET_ORDER);
    print_r($res);
    Il y a quand même une limitation en ce qui concerne les patterns récursif, c'est qu'on ne peut pas capturer (rapatrier vers php) toutes les sous parties qui constituent la récursion (en l'occurence ici, les { } imbriqués et potentiellement juxtaposés). Soit tu as le premier macro groupement, soit le dernier.

    Genre '\begin{tabular}{bla{h}}', tu choperas 'tabular' ou '{bla{h}}'

    Pour lever cette limitation, on pourrait passer par des callbacks ou plusieurs séries de matches (ce qui est un peu dans la logique de ton devoir de parser)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Par défaut
    Merci beaucoup. Ça m'est d'une très grande aide.

    J’étais en train d’essayer des choses, mais ça n’avait pas toute cette complexité !!Je viens de tester et c'est nickel. Maintenant je vais essayer de comprendre un petit peu tous les arguments !!!

    Merci encore

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

Discussions similaires

  1. Regex et antislash
    Par Tesing dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/08/2011, 19h32
  2. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  3. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

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