Regex Groupes optionnels?
-
06-07-2019 - |
Question
Il semble que je me suis confondu avec une regex preg_match que je suis en train de faire, donc des yeux neufs et de l'aide seraient appréciés.
Mon expression rationnelle actuelle est la suivante:
/<!--menu:start:\(([0-9])\,([0-9])\)-->(.*?)<!--menu:end-->/se
Je cherche à entrer le nombre et les deux points, par exemple. : (1,4) facultatif, cela correspond donc à:
<!--menu:start--><!--menu:end-->
ou
<!--menu:start:(0,3)--><!--menu:end-->
La solution
Joindre à un groupe ne correspondant pas et le définir en option: (?:...)?
/<!--menu:start(?::\(([0-9])\,([0-9])\))?-->(.*?)<!--menu:end-->/se
Autres conseils
Comme ceci:
/<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se
J'ai ajouté un groupe, (?: )
non-capturant, autour de la partie que vous souhaitez voir optionnelle, puis vous l'avez suffixé d'un point d'interrogation: (?:<optional content>)?
Ceci utilise un groupe facultatif sans capture - (?: )?
- pour correspondre à votre pièce facultative, ainsi que \d
au lieu de [0-9]
pour faire correspondre les chiffres:
/<!--menu:start(?::\((\d),(\d)\))?-->(.*?)<!--menu:end-->/se
Si les nombres entre parenthèses peuvent être composés de plusieurs chiffres, utilisez celui-ci à la place:
/<!--menu:start(?::\((\d+),(\d+)\))?-->(.*?)<!--menu:end-->/se