我正在尝试计算一个PCRE正则表达式字符串,用于匹配和捕获可变长度字符串,以便在我的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_];modifierName后面跟着方括号中的一个或多个参数的参数列表,[和]。参数列表由管道|分隔。可以有零或多个\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] }}发布于 2010-11-05 04:54:09
您不希望在一个regexp中获取整个事件,因为您可能希望将修饰符作为一个数组。regexp将始终有固定数量的捕获,对应于捕获括号的数量。
抓取主要内容({{ something }}),将内容拆分为空格,然后循环并分别匹配每个内容,将内容推入适当的标量或数组中(如果允许具有相同前缀的更多修饰符)。
https://stackoverflow.com/questions/4103651
复制相似问题