Skip to content
Advertisement

Retrieving the top-level element with Regex

I have the string bellow:

$string = '

@if(topLevel)
{{
  <form method="post">
    @if(bottomLevel)
    {{
      <input>
    }}
  </form>
}}';

What i’m trying is to find the value inside the @if(.*?) and the content between the brackets of the top level “@if”.

This is the pattern i’ve tried:

@if((.*?))(s|n|t)+{{(s|n|t)(.*?)(s|n|t)}}

This is matching:

@if(bottomLevel)
{{
  <input>
}}

How can i go from the outside into the string and match the top level “@if”?

Advertisement

Answer

Use singleline flag, and remove lazy from .*?:

@if((.*?))s+{{s*(.*)s*}}

And since TAB is included in s, and with the singleline flag n as well, you only need s to match the white space.

See it here at regex101.

Edit

Here’s an alternative using recursion, to manage multiple groups of braces.

@if((.*?))s+{{((?:[^{}]|(?R))*)}}

Regex101 example.

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement