0
我正在努力找出一個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|...] }}
- 分隔符
{{
和}}
。 - 有效的
type
或name
表示爲[a-z_][a-z0-9_]*
;將只有一個type:name
對,它會首先出現。 - 有效的
modifierType
或modifierName
表示爲[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] }}
感謝您的快速回答** Amadan **。我有一種感覺會是更好的路線。由於每個修飾符只有一個實例(只有一個「格式」,只有一個「容器」等),我想我可以爲每種類型編寫捕獲。然而,我想保持向前兼容的東西,所以我現在看到多次運行是最好的,更不用說每個修改器的可變長度參數列表。 – Dan 2010-11-05 05:03:31