Regex Необязательные группы? - PullRequest
15 голосов
/ 22 июня 2009

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

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

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

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

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

или

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

Ответы [ 3 ]

31 голосов
/ 22 июня 2009

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

/<!--menu:start(?::\(([0-9])\,([0-9])\))?-->(.*?)<!--menu:end-->/se
28 голосов
/ 22 июня 2009

Как это:

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

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

5 голосов
/ 22 июня 2009

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

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

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

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