2009-06-22 9 views
15

Je semble m'être embrouillé avec une regex preg_match que je suis en train de faire, donc des yeux frais et de l'aide seraient appréciés.Groupes optionnels Regex?

Mon regex actuelle est la suivante:

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

Je cherche à faire l'entrée du nombre et du côlon par exemple : (1,4) en option, il égalerait:

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

ou

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

Répondre

30

En étroite avec un groupe correspondant non et le mettre à option: (?:...)?

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

Comme ceci:

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

J'ai ajouté un groupe non-capture, (?:), autour de la partie que vous souhaitez être facultatif, puis suivi d'un point d'interrogation: (?:<optional content>)?

+0

Haha , c'est un lien étroit ... :) – glmxndr

+0

En effet, il est =) – Blixt

+0

Merci les gars :) A dû en choisir un! – Joel

5

Il utilise un groupe non-capture en option - (?:)? - pour correspondre à votre partie en option, et aussi \d au lieu de [0-9] pour correspondre à des chiffres:

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

Si les chiffres entre parenthèses peuvent être constituées de plus d'un chiffre, utilisez plutôt celui-ci:

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

Y at-il un avantage à utiliser \ d au lieu de [0-9]? – Joel

+0

Aucun réellement, sauf que \ d est plus court. :-) – Helen

+0

Voir http://stackoverflow.com/questions/890686/should-i-use-d-or-0-9-to-match-digits-in-a-perl-regex pour les différences de \ d et [0-9] – ParoX

Questions connexes