Düzenli ifade: tam belirteci şey ama Maç

2 Cevap php

Ben {foreach} ve {/foreach} Normal bir ifade kullanarak arasındaki kodu ayıklamak istiyorum şu pasajı var:

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

Ben zaten:

{foreach [^}]*}

ama bundan sonra her şey maç kuramıyorum. Bir bütün belirteç olarak bir şey ANCAK {/ foreach} maç için herhangi bir yolu var mı? {Foreach} {/ foreach} arasındaki içeriği de "{$" belirteçleri içerebilir unutmayın.

Edit: BaileyP en & Tomalak cevapları doğru, ama basitlik uğruna BaileyP cevabını seçtiniz.

2 Cevap

Ben bu ile geldi

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

RegExr ile test

Lütfen regex lezzet olmayan açgözlü eşleştirme destek olmasaydı, şu bunu yapardı, ama öyle beri @BaileyP's answer öneririz.

\{foreach [^}]*\}((?:.(?!\{/foreach\}))*[^{]?)

Sizin lehinize regex bağlı olarak, negatif sıfır genişlikli look-ahead ve non-yakalama grupları biraz farklı görünüyor.

İşte bileşenleri şunlardır:

\{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