正则表达式的conditition

时间:2016-05-22 22:43:42

标签: php regex template-engine preg-replace-callback

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

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

REGEX链接: https://regex101.com/r/hE4hX3/3

2 个答案:

答案 0 :(得分:1)

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

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

demo

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

内容相同,请使用[^@]*并在每个"@"之后检查"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

Regex101

Regexps是制作这样的东西的坏工具。
例如,您现在不能使用嵌套的if 更好的是实现简单的解析器,这将使其工作正确并可以扩展到新的语法。