Регулярное выражение: сопоставить что угодно, кроме полного токена - PullRequest
1 голос
/ 04 декабря 2008

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

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

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

{foreach [^}]*}

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

Редактировать : ответы BaileyP и Tomalak верны, но я выбрал ответ BaileyP для простоты.

Ответы [ 2 ]

5 голосов
/ 04 декабря 2008

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

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

Протестировано с RegExr

2 голосов
/ 04 декабря 2008

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

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