Дополнительные группы регулярных выражений?
-
06-07-2019 - |
Вопрос
Кажется, я запутался с регулярным выражением preg_match, поэтому буду признателен за свежий взгляд и помощь.
Мое текущее регулярное выражение выглядит следующим образом:
/<!--menu:start:\(([0-9])\,([0-9])\)-->(.*?)<!--menu:end-->/se
Я хочу ввести число и двоеточие, например.:(1,4) необязательно, поэтому оно будет соответствовать:
<!--menu:start--><!--menu:end-->
или
<!--menu:start:(0,3)--><!--menu:end-->
Решение
Добавьте не соответствующую группу и установите для нее значение необязательно: (?:...)?
/<!--menu:start(?::\(([0-9])\,([0-9])\))?-->(.*?)<!--menu:end-->/se
Другие советы
Так:
/<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se
Я добавил группу без захвата, (?: )
, вокруг той части, которую вы хотите сделать необязательной, а затем добавьте к ней вопросительный знак: (?:<optional content>)?
При этом используется необязательная группа без захвата -- (?: )?
-- Чтобы соответствовать вашей дополнительной части, а также \d
вместо [0-9]
для соответствия цифрам:
/<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se
Если числа в скобках могут состоять из более чем одной цифры, используйте вместо них следующую:
/<!--menu:start(?::\((\d+),(\d+)\))?-->(.*?)<!--menu:end-->/se