正则表达式可选组?

时间:2009-06-22 09:10:33

标签: php regex preg-replace preg-match

我似乎把自己与我正在做的preg_match正则表达混淆了,所以新的眼睛和帮助将会受到赞赏。

我现在的正则表达式如下:

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

我正在寻找数字输入和冒号,例如:(1,4)可选,所以它匹配:

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

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

3 个答案:

答案 0 :(得分:31)

附上非匹配组并将其设置为可选:(?:...)?

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

答案 1 :(得分:28)

像这样:

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

我在您想要选择的部分周围添加了一个非捕获组(?: ),然后在其后面添加一个问号:(?:<optional content>)?

答案 2 :(得分:5)

这使用可选的非捕获组 - (?: )? - 来匹配您的可选部分,并使用\d代替[0-9]来匹配数字:

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

如果括号中的数字可以包含多个数字,请改为使用此数字:

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