我有字符串:
$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;?
答案 0 :(得分:2)
使用单行标记,并从.*?
删除延迟:
@if\((.*?)\)\s+{{\s*(.*)\s*}}
由于TAB包含在\s
中,并且单行标记\n
,因此您只需要\s
来匹配空格。< / p>
修改强>
这是使用递归的替代方法,用于管理多组括号。
@if\((.*?)\)\s+{{((?:[^{}]|(?R))*)}}
答案 1 :(得分:1)
(.*?)
的 ?
是非贪婪的匹配,这意味着它会找到最短的匹配。尝试不使用?
,它不会在第一个}}
停止。您还应该打开单行标记/s
,并用简单的\s*
替换您的空白模式。
结果:/@if\((.*?)\)\s*\{\{\s*(.*)\s*\}\}/s
PS:我转义了{}
个字符,这对你的情况来说不是必需的,但我喜欢转义那些在正则表达式中有意义的字符。
答案 2 :(得分:1)
抱歉,我讨厌preg_matches,所以我选择了substr和substr-count,我喜欢它的可读性:
<persistence-unit name="foo">
<!-- property comes from root pom.xml -->
<jar-file>../lib/foo-${bar.version}.jar</jar-file>
<properties>
</properties>
</persistence-unit>
答案 3 :(得分:0)
我不认为正则表达式是解析代码的最佳方法,无论如何,这是一个建议,可以两次获得所需代码的一部分:
@if\((\w+)\)
它从你的字符串中提取:
topLevel
bottomLevel
{{\s+([<\w\s"@(){}\/=>]+)}}
它从你的字符串中提取:
<form method="post">
@if(bottomLevel)
{{
<input>
}}
</form>
答案 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+
。.*
匹配多行,您需要使用单行修饰符。