2010-11-05 80 views
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|...] }} 
  • 分隔符{{}}
  • 有效的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] }} 

回答

2

你不想搶了整個事情的一個正則表達式,因爲你可能想修飾符數組。正則表達式將始終具有不變的捕獲次數,對應於捕獲括號的數量。

抓住主要東西({{ something }}),用空格拆分內容,然後分別循環和匹配每個內容,將內容推送到適當的標量或數組中(如果允許使用相同前綴的更多修飾符)。

+0

感謝您的快速回答** Amadan **。我有一種感覺會是更好的路線。由於每個修飾符只有一個實例(只有一個「格式」,只有一個「容器」等),我想我可以爲每種類型編寫捕獲。然而,我想保持向前兼容的東西,所以我現在看到多次運行是最好的,更不用說每個修改器的可變長度參數列表。 – Dan 2010-11-05 05:03:31