使用Regex检索顶级元素

时间:2017-05-23 11:38:55

标签: php regex

我有字符串:

$string = '

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

我尝试的是找到@if(。*?)中的值和顶层括号之间的内容&#34; @ if&#34;。

这是我试过的模式:

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

这是匹配的:

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

我如何从外面进入字符串并匹配顶级&#34; @ if&#34;?

6 个答案:

答案 0 :(得分:2)

使用单行标记,并从.*?删除延迟:

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

由于TAB包含在\s中,并且单行标记\n,因此您只需要\s来匹配空格。< / p>

See it here at regex101

修改

这是使用递归的替代方法,用于管理多组括号。

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

Regex101 example

答案 1 :(得分:1)

带有(.*?)

?是非贪婪的匹配,这意味着它会找到最短的匹配。尝试不使用?,它不会在第一个}}停止。您还应该打开单行标记/s,并用简单的\s*替换您的空白模式。

结果:/@if\((.*?)\)\s*\{\{\s*(.*)\s*\}\}/s

PS:我转义了{}个字符,这对你的情况来说不是必需的,但我喜欢转义那些在正则表达式中有意义的字符。

答案 2 :(得分:1)

抱歉,我讨厌preg_matches,所以我选择了substrsubstr-count,我喜欢它的可读性:

<persistence-unit name="foo">
    <!-- property comes from root pom.xml -->
    <jar-file>../lib/foo-${bar.version}.jar</jar-file>
    <properties>

    </properties>
</persistence-unit>

Get substring between two strings PHP启发

答案 3 :(得分:0)

我不认为正则表达式是解析代码的最佳方法,无论如何,这是一个建议,可以两次获得所需代码的一部分:

正则表达式1:在@if(...)

中提取参数
@if\((\w+)\)

它从你的字符串中提取:

topLevel
bottomLevel

Test it on regex101

正则表达式2:获取括号

之间的值
{{\s+([<\w\s"@(){}\/=>]+)}}

它从你的字符串中提取:

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

Test it on regex101

答案 4 :(得分:0)

尝试一下:

{{\n\s+(.+)\n.+}}

它寻找打开双花括号,然后是一个新行,然后是任意数量的字符,后跟一个新行,一些空格,任何字符后跟一个新行,任何字符,然后是结束}}。括号捕获特定文本。

您可以在此处查看示例:https://regex101.com/r/pwFNA1/1

答案 5 :(得分:0)

这是支持多重嵌套的通用正则表达式:

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

上尉群组为$1$3。请参阅demo

无论如何,我有一些通用的提示:

  • \t\n\s方面是多余的。请勿使用(\t|\n|\s)+,只使用\s+
  • 您无法使用.*匹配多行,您需要使用单行修饰符。