我的模板类的条件有问题。 我做错了什么?
/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,\$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*))@endif/m
REGEX链接: https://regex101.com/r/hE4hX3/3
答案 0 :(得分:1)
使用带有否定字符类的禁用字符列表,而不是使用允许字符列表。例如:
~
@if \( (?P<condition> [^)]* ) \)
\s*
(?P<content> [^@]*+ (?: @(?!endif\b) [^@]* )*+ )
@endif
~x
代替条件.*
(不知道在哪里停止),使用抓取所有内容的[^)]*
直到右括号。
内容相同,请使用[^@]*
并在每个"@"
之后检查"endif"
后是否"@"
。 (这样,内容中允许\n*\s*
。)
其他事情:写\s
没有意义,因为这两个是可选的,\n
已经包含cell
,这就是我删除它的原因。
答案 1 :(得分:0)
你应该使用ungreedy operator *?
和g
标志来实现你想要的多个匹配:
/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,\$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*?))@endif/mg
或简化:
/@if\((?P<condition>.*?)\)\s*(?P<content>([\s\S]*?))@endif/mg
Regexps是制作这样的东西的坏工具。
例如,您现在不能使用嵌套的if
更好的是实现简单的解析器,这将使其工作正确并可以扩展到新的语法。