2009-06-22 26 views
15

我似乎與我正在做的preg_match正則表達式相混淆,所以新鮮的眼睛和幫助將不勝感激。Regex可選組?

我現在的正則表達式如下:

/<!--menu:start:\(([0-9])\,([0-9])\)-->(.*?)<!--menu:end-->/se 

我期待使號碼輸入和結腸例如:(1,4)可選的,所以它會匹配:

<!--menu:start--><!--menu:end--> 

<!--menu:start:(0,3)--><!--menu:end--> 

回答

30

En密切與非匹配組,並將其設置爲可選:(?:...)?

/<!--menu:start(?::\(([0-9])\,([0-9])\))?-->(.*?)<!--menu:end-->/se 
27

像這樣:

​​

我添加了一個非捕獲組,(?:),圍繞要選擇的部分,然後用問號將其後綴:(?:<optional content>)?

+0

哈哈,這是一個密切的關係... :) – glmxndr 2009-06-22 09:14:50

+0

確實,它=) – Blixt 2009-06-22 09:15:57

5

它使用一個可選的非捕獲組 - (?:)? - 以符合您的可選部分,並且也\d代替[0-9]匹配數字:

​​

如果括號中的數字可以由一個以上的數字的,用這個來代替:

/<!--menu:start(?::\((\d+),(\d+)\))?-->(.*?)<!--menu:end-->/se