Regular expression: match everything but the full token
I have the following snippet where I would like to extract the code between {foreach}
and {/foreach}
using a regex:
{foreach (...)}
Some random HTML content <div class="">aklakdls</div> and some {$/r/template} markup inside.
{/foreach}
I already have it:
{foreach [^}]*}
but after that I can't do anything about it. Is there a way to match something to BUT {/ foreach} in general? Note that the content between {foreach} {/ foreach} can also contain "{$" tokens.
Edit : BaileyP and Tomalak's answers are correct, but I chose BaileyP's answer for simplicity.
+1
source to share
2 answers
If your regex flavor didn't support the unwanted match, the following would do it, but as I recommend @ BaileyP's answer .
\{foreach [^}]*\}((?:.(?!\{/foreach\}))*[^{]?)
Negative zero-width and non-capturing groups look slightly different depending on your regex.
Here are the components:
\ {foreach [^}] * \} // pretty much self-explanatory
(// match group one starts (that 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
+2
source to share