Regex Optional Groups?

19,871

Solution 1

Enclose with a non matching group and set it to optional : (?:...)?

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

Solution 2

Like this:

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

I've added a non-capturing group, (?: ), around the part you want to be optional, and then suffixed it with a question mark: (?:<optional content>)?

Solution 3

This uses an optional non-capturing group -- (?: )? -- to match your optional part, and also \d instead of [0-9] to match digits:

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

If numbers in parentheses can consist of more than one digit, use this one instead:

/<!--menu:start(?::\((\d+),(\d+)\))?-->(.*?)<!--menu:end-->/se
Share:
19,871
Joel
Author by

Joel

I'm a web developer based in Brighton, England.

Updated on June 04, 2022

Comments

  • Joel
    Joel almost 2 years

    I seem to have confused myself with a preg_match regex I'm doing, so fresh eyes and help would be appreciated.

    My current regex is as follows:

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

    I am looking to make the number input and colon e.g. :(1,4) optional, so it would match:

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

    or

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