Expression régulière trop gourmande ?

Petit nouveau ! | 2 Messages

08 févr. 2010, 19:30

Bonsoir,

Pour faire simple, j'aimerais extraire de cette chaine les portions commençant par X et terminant par Z. C'est un exemple, en pratique c'est un gros fichier avec des blocs à extraire.

Chaine : uuuXuuuXuuuXuuuZuuuXuuuZuuuXuuuZuu

Voici donc mon expression régulière :preg_match_all("#X(.+)Z#U", "uuuXuuuXuuuXuuuZuuuXuuuuZuuuXuuuuuZuu", $bloc);

En retour j'ai :

Array
(
[0] => Array
(
[0] => XuuuXuuuXuuuZ
[1] => XuuuuZ
[2] => XuuuuuZ
)

[1] => Array
(
[0] => uuuXuuuXuuu
[1] => uuuu
[2] => uuuuu
)

)

Pour le premier résultat retourné, il me prend le premier X qu'il rencontre. hors j'aimerais avoir le dernier X, celui qui est le plus proche du premier Z.

J'ai essayé ceci également sans succès : preg_match_all("#X(.+?)Z#", "uuuXuuuXuuuXuuuZuuuXuuuuZuuuXuuuuuZuu", $bloc);

Merci pour votre aide.

Eléphant du PHP | 63 Messages

08 févr. 2010, 22:15

Tout simplement :

Code : Tout sélectionner

/X([^XZ]+)Z/

Petit nouveau ! | 2 Messages

09 févr. 2010, 11:52

Merci pour cette réponse. En fait je pensais que la solution de l'exemple donné sur lequel je fais des essais aller résoudre le problème mais en fait non.

J'essaie de récupérer les redirections 301 d'un nom de domaine précis dans le fichier httpd.conf

Exemple :

Code : Tout sélectionner

<VirtualHost xx.xx.xx.xx:80> ServerAdmin [email protected] DocumentRoot /home/monsite/www SuexecUserGroup monsite users ServerName www.monsite.fr ServerAlias monsite.fr CustomLog logs/monsite-access_log combined ScriptAlias /cgi-bin/ /home/monsite/cgi-bin/ </VirtualHost> <VirtualHost xx.xx.xx.xx:80> ServerAlias monsite.com ServerAlias www.monsite.com Redirect 301 / http://www.monsite.fr </VirtualHost>
J'utilise cette expression régulière sans succès :

Code : Tout sélectionner

preg_match_all("#<VirtualHost xx.xx.xx.xx:80>(.+)Redirect 301 / http://www.monsite.fr\n</VirtualHost>#isU", $contenu, $bloc);
Il me récupère tout et non juste le dernier bloc qui m'intéresse. j'ai un peu de mal avec la solution donnée, j'ai regardé aussi du coté des assertions avant/arrières - positive/negative.

Quelqu'un aurait une solution?

Merci.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 févr. 2010, 12:25

Suffit d'adapter la règle de ooflorent :)

Il te propose de récupérer une chaine commençant par X, se terminant par Z et ne contenant ni X ni Z. Dans ton cas, il suffit d'identifier ce que ta chaine n'a pas le droit de contenir pour l'en excluse. Par exemple un crochet "<" que tu ne retrouvera jamais à l'intérieur d'un virtual host :
preg_match_all("#<VirtualHost xx.xx.xx.xx:80>([^<]+)Redirect 301 / http://www.monsite.fr\n</VirtualHost>#isU", $contenu, $bloc);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...