帮助正则表达式(PCRE)

问题描述:

我正在努力找出一个PCRE正则表达式字符串来匹配和捕获可变长度的字符串,以便在我的PHP应用程序中使用。我希望(如果合理)在单个解析中执行这些操作,但如果它在计算上似乎最合理,我可以将其分解为由应用程序逻辑划分的多个运行。帮助正则表达式(PCRE)

可能包含更大的文本块中的几个例子字符串:

{{ 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|...] }} 
  • 分隔符{{}}
  • 有效的typename表示为[a-z_][a-z0-9_]*;将只有一个type:name对,它会首先出现。
  • 有效的modifierTypemodifierName表示为[a-z_][a-z0-9_]; modifierName后跟一个方括号中的一个或多个参数的参数列表,[]。参数列表由管道|分隔。可以有零个或多个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] }} 

你不想抢了整个事情的一个正则表达式,因为你可能想修饰符数组。正则表达式将始终具有不变的捕获次数,对应于捕获括号的数量。

抓住主要东西({{ something }}),用空格拆分内容,然后分别循环和匹配每个内容,将内容推送到适当的标量或数组中(如果允许使用相同前缀的更多修饰符)。

+0

感谢您的快速回答** Amadan **。我有一种感觉会是更好的路线。由于每个修饰符只有一个实例(只有一个“格式”,只有一个“容器”等),我想我可以为每种类型编写捕获。然而,我想保持向前兼容的东西,所以我现在看到多次运行是最好的,更不用说每个修改器的可变长度参数列表。 – Dan 2010-11-05 05:03:31