Вопрос

Кажется, я запутался с регулярным выражением 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top