Дополнительные группы Regex?

Кажется, я запутался в регулярном выражении preg_match, который я делаю, поэтому мы будем рады видеть свежие глаза и помощь.

Мое текущее регулярное выражение выглядит следующим образом:

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

Я ищу, чтобы ввести число и двоеточие, например.: (1,4) необязательно, поэтому он будет соответствовать:

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

или

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

Ответы

Ответ 1

Заключитесь с несоответствующей группой и установите ее как необязательную: (?:...)?

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

Ответ 2

Вот так:

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

Я добавил группу, не связанную с захватом, (?: ), вокруг части, которую вы хотите быть необязательной, и затем добавьте ее с вопросительным знаком: (?:<optional content>)?

Ответ 3

В этой опции используется необязательная группа без привязки - (?: )? - для соответствия вашей необязательной части, а также \d вместо [0-9] для соответствия цифрам:

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

Если числа в круглых скобках могут состоять из более чем одной цифры, используйте вместо этого:

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