正则条件

Regex conditition

我的模板条件有问题 class。 我做错了什么?

/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*))@endif/m

正则表达式 Link : https://regex101.com/r/hE4hX3/3

您应该使用不贪婪的运算符 *?g 标志来进行多个匹配以实现您想要的:

/@if\((?P<condition>.*)\)\n*\s*(?P<content>(?s:[\=\"\;\,$\{\}\_\(\)\.\!\'\-\:\s\/\<\>\w\näöüÄÖÜèéà@]*?))@endif/mg

或简化:

/@if\((?P<condition>.*?)\)\s*(?P<content>([\s\S]*?))@endif/mg

Regex101


正则表达式是做这样事情的糟糕工具。
例如,您现在不能使用嵌套 ifs。
更好的是实现简单的解析器,这将使它的工作正确并可以扩展到新的语法。

不使用允许字符列表,而是使用带否定字符的禁止字符列表 类。示例:

~
@if \( (?P<condition> [^)]* ) \)
\s*
(?P<content> [^@]*+ (?: @(?!endif\b) [^@]* )*+ )
@endif
~x

demo

代替 .* 条件(不知道在哪里停止),使用 [^)]* 抓住所有直到右括号。

内容相同,使用 [^@]* 并在每个 "@" 之后检查是否有 "endif"(这样内容中允许"@"。)

其他:写\n*\s*没有意义,因为这两个是可选的,\s已经包含\n,所以我删除了它。