2008-12-04 7 views
1

Je l'extrait suivant où je voudrais extraire le code entre le {foreach} et {/foreach} utilisant une expression régulière:Expression régulière: Faites correspondre quelque chose mais plein jeton

{foreach (...)} 
Some random HTML content <div class="">aklakdls</div> and some {$/r/template} markup inside. 
{/foreach} 

J'ai déjà:

{foreach [^}]*} 

mais je suis incapable de faire correspondre quoi que ce soit après cela. Y a-t-il un moyen de faire correspondre n'importe quoi, mais {/ foreach} comme un jeton entier? Veuillez noter que le contenu entre {foreach} {/ foreach} peut également contenir des jetons "{$".

Édition: BaileyP's & Les réponses de Tomalak sont correctes, mais j'ai choisi la réponse de BaileyP pour des raisons de simplicité.

Répondre

5

je suis venu avec cette

/(?:{foreach .*?})(.*?)(?:{\/foreach})/gis 

Testé avec RegExr

+0

Oui. Je me sens un peu stupide maintenant. :-D Parfois, je pense que c'est un peu trop compliqué, je tapais la même chose tout à l'heure. +1 – Tomalak

+0

Ce n'est pas infaillible, bien sûr. Les boucles foreach imbriquées vont le casser - mais c'est un problème que vous ne pouvez pas résoudre avec les expressions régulières seules. –

+0

Vous pouvez faire des boucles foreach imbriquées avec Perl6 Grammars et Perl 5.10 regexps. –

2

Si votre saveur regex ne supportait pas la correspondance non gourmande, ce qui suit le ferait, mais depuis, je recommande @BaileyP's answer. En fonction de votre préférence de regex, les groupes de prévisualisation négative de largeur nulle et les groupes non-capturés sont un peu différents.

Voici les composants:

 
\{foreach [^}]*\} // pretty much self-explanatory 
(     // match group one starts (that's what you are looking for) 
(?:    // non-capturing group starts 
    .    // anything... 
    (?!\{/foreach\}) // ... that is not followed by "{/foreach}" 
)*    // non-capturing group ends, repeat as often as possible 
[^{]?    // match the last character, unless it is "{" 
)     // match group one ends, done 
+0

Wow! Vous êtes maître Regex! Cela fonctionne, mais il y a un problème, le dernier caractère juste avant que le {/ foreach} ne corresponde. Comment résoudriez-vous cela? – Vincent

+0

Duh. Bien sûr. Attends une seconde. – Tomalak

+0

Vous devez mettre le point * après * le lookahead, pas avant. –

Questions connexes