2012-04-09 21 views
-2

我在正則表達式非常糟糕,因此需要一些幫助:PHP - 正則表達式的多個選項解析

我需要找到多個選項,在內容一個正則表達式:

  1. {{ Value }} - 始終
  2. {{ Value | Value 2 }} - 可選的第二部分 - |值2
  3. {{ Value | Value 2(Value3) }} - 可選的第三部分 - (值3)

規則:空格前後值

我這是什麼允許的,但它並不適用於所有三個方面的需求和可選的工作:

/\{{(.*)|(.*)}}/siU 

回答

1
/\{{2}\s*?(.+)(?:\s*?\|\s*?(.+)\s*?(?:\(\s*?(.+)\s*?\))?)?\s*?\}{2}/isU 

美化這個自己請。

  • \{{2}是開口大括號(\{),它們中的正好兩個({2})。
  • \s*?是一個空白(\s),零級或更多次(*)和儘可能多的(?在ungreedy模式)
  • (.+)是任何字符(.),一次或多次(+
  • (?:x)?是未添加到結果(?:)中的子表達式x,該表達式不會出現或一次出現(尾隨?)。這裏用於使「Value 2」部分可選。
  • \s*?\|\s*?與找到的空格一樣多,垂直條和更多空格(如果找到)。
  • 之後是「值3」的另一個可選子表達式。
  • \(\s*?(.+)\s*?\)是一個左括號(\(),因爲許多空格作爲實測值(\s*?再次),實際內容(至少一個字符,.+),更空格和一個右括號。
  • \}{2}是關閉的大括號,正好兩個也是。
0

我的做法

/\{\{[\s\W]*((\w+)([\s\W]*\|[\s\W]*([\w]+)([\s\W]*\([\s\W]*(\w+)[\s\W]*\)[\s\W]*){0,1}){0,1})[\s\W]*\}\}/