2008-12-04 6 views
1

я следующий фрагмент, где я хотел бы извлечь код между {foreach} и {/foreach}, используя регулярное выражение:Регулярное выражение: матч ничего, кроме полного символического

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

У меня уже есть:

{foreach [^}]*} 

, но после этого я ничего не могу с этим поделать. Есть ли способ сопоставить что-нибудь BUT {/ foreach} в целом? Обратите внимание, что содержимое между {foreach} {/ foreach} также может содержать "{$" токенов.

Edit: & ответы Томалак в BaileyP являются правильными, но я выбрал ответ BaileyP в ради простоты.

ответ

5

Я придумал этот

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

Испытано с RegExr

+0

Да. Сейчас я чувствую себя немного глупо. :-D Иногда я думаю, что слишком сложно, набирал то же самое только сейчас. +1 – Tomalak

+0

Это, конечно, не безупречно. Вложенные петли foreach будут разбивать его, но это проблема, которую вы не можете решить с помощью регулярных выражений в любом случае. –

+0

Вы можете делать вложенные петли foreach с помощью Perl6 Grammars и Perl 5.10 regexps. –

2

Если ваш аромат регулярного выражения не поддерживает нежелательное соответствие, следующее будет делать это, но, поскольку я рекомендую @BaileyP's answer.

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

В зависимости от вашего предпочтения в регулярном выражении отрицательные нуль-ширины вперед и не захватывающие группы выглядят немного иначе.

Вот компоненты:

 
\{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! Вы мастер Regex! Он работает, но есть одна проблема: последний символ перед {/ foreach} не сопоставляется. Как бы вы это решили? – Vincent

+0

Duh. Конечно. Подожди секунду. – Tomalak

+0

Вам нужно поставить точку * после * lookahead, а не перед ней. –

 Смежные вопросы

  • Нет связанных вопросов^_^