Using PHP8, I’m struggling to figure out how to conditionally match some key that may or may not appear in a string.
I would like to match both
The dashes("-") could be any non-space character, and only used here for a cleaner to read example.
The regex is matching "key=…" if its containing group is greedy like below.
But this isn’t adequate, because the full match will fail a "key=xyz" is missing the subject string.
/ (\S*)? (key\=(?<foundkey>[[:alnum:]-]*)) \S* /x
if that capture group is non-greedy, then the regex just ignores the key match any "key=xyz"
/ (\S*)? (key\=(?<foundkey>[[:alnum:]-]*))? \S* /x
I tried debugging in this regex101 example but couldn’t figure it out.
I sorted this out using multiple regexs, but hoping someone can help address my misunderstandings so I learn know how to make this work as a single regex.
You may use:
/ ^ \S*? (?: key=(?<foundkey>\w+) \S* )? $ /xm
\S*?: Match 0 or more whitespaces non-greedy
(?:: Start Lookahead
key=text followed by 1+ word characters as capture group
\S*: Match 0 or more whitespaces
)?: End lookahead.
?makes it an optional match