2009-06-22 28 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