Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/02/2007, 13h40   #1
Invité de passage
 
Inscription : mars 2006
Messages : 3
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2006
Messages : 3
Points : 1
Points : 1
Envoyer un message via MSN à MagiCCyriL Envoyer un message via Skype™ à MagiCCyriL
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...)
MagiCCyriL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 16h30   #2
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
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 :
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)
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 16h37   #3
Invité de passage
 
Inscription : mars 2006
Messages : 3
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2006
Messages : 3
Points : 1
Points : 1
Envoyer un message via MSN à MagiCCyriL Envoyer un message via Skype™ à MagiCCyriL
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 ?
MagiCCyriL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 17h51   #4
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Code :
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)
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2007, 18h00   #5
Invité de passage
 
Inscription : mars 2006
Messages : 3
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : mars 2006
Messages : 3
Points : 1
Points : 1
Envoyer un message via MSN à MagiCCyriL Envoyer un message via Skype™ à MagiCCyriL
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
MagiCCyriL est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h21.


 
 
 
 
Partenaires

Hébergement Web