我正在尝试计算一个PCRE regex字符串,用于匹配和捕获可变长度的字符串,以便在我的PHP应用程序中使用。我希望(如果可能的话)在一个解析中执行这些操作,但是如果在计算上看起来最合理的话,我可以将它分成几个运行,并按应用程序逻辑进行划分。
{{ var:myVar }}
{{ component:myComponent}}
{{ var:myVar modifier:function[arg1|arg2] }}
{{ region:myRegion modifier:function[arg1|arg2] modifier:function[arg1] }}
如您所见,目标字符串之间可能存在相当大的差异。总结:
{{ type:name modifierType:modifierName[arg1|arg2|...] }}
-
分隔符
{{
}}
.
-
有效的
type
或
name
表示为
[a-z_][a-z0-9_]*
;只有一个
type:name
-
有效的
modifierType
或
modifierName
表示为
[a-z_][a-z0-9_]
;的
后跟方括号中一个或多个参数的参数列表,
[
和
]
. 参数列表由管道分隔
|
. 可能有零个或多个
modifierType:modifierName[argumentList]
集合。
-
字符串的所有部分都由一个或多个空格字符分隔
\s+
无论如何,匹配的集合
{{ type:name }}
很简单,但我无法找到有效获取可变长度修饰符列表的方法。对于简单类型/名称对,我使用以下不区分大小写/自由间距字符串:
'% {{ \s+ (?<type>var|component|region):(?<name>[a-z_][a-z0-9_]*) \s+ }} %ix'
因此,任何关于捕获两者的建议:
{{ component:myComponent }}
{{ var:myVar format:datetime[Y-m-d] container:h3[class=timestamp|id=main] }}