2013-04-29 3 views
1

Disons que j'ai la chaîne suivante: Func(param1, param2) avec un nombre inconnu de paramètres.
Et je veux obtenir le tableau suivant:Capture du sous-motif répétitif

Array(
    [0] => Func(param1, param2), 
    [1] => Func 
    [2] => param1, 
    [3] => param2, 
    ... 
) 

J'ai essayé ceci:

$str = 'Func(param1, param2)'; 
preg_match('/^([a-z]+)\((?:([a-z0-9]+)\s*,?\s*)*\)$/i', $str, $matches); 
print_r($matches); 

Et c'est la sortie:

Array 
(
    [0] => Func(param1, param2) 
    [1] => Func 
    [2] => param2 
) 

Le sous-motif qui capture les params captures seulement le dernier param. Et je veux qu'il capture tous les paramètres.

Des idées?

EDIT:
Je sais que je peux saisir toutes les params puis utilisez exploser. Mais ce n'est pas ma question.
Je veux savoir comment cela se fait avec les expressions régulières.

+2

Je dois vous décevoir, mais ce que vous voulez ** n'est pas possible en PHP ** et c'est la même chose pour presque toutes les langues [sauf Perl 6 et .NET] (http://stackoverflow.com/a/6571139/). Il s'appelle ** groupes de capture répétés ** et il a déjà été demandé [ici] (http://stackoverflow.com/q/6371226/) et [ici] (http://stackoverflow.com/q/6579908/). – HamZa

+0

@HamZa DzCyberDeV D'accord, merci. –

Répondre

-1

Vous pouvez obtenir tous les params à la fois et obtenir un tableau de cette chaîne en utilisant explode:

$str = 'Func(param1, param2)'; 
preg_match('/^([a-z]+)\(([a-z0-9\,\s]+)\)$/i', $str, $matches); 
print_r($matches); 

$params = explode(',', str_replace(' ', '', $matches[2])); 

print_r($params); 
+0

Je le sais. Mais ma question est de savoir comment je peux le faire sans exploser. –

+0

Oui, j'ai vu votre édition. Je vais jeter un coup d'oeil mais c'était la première chose à laquelle j'ai pensé. Avez-vous une raison sérieuse de ne pas utiliser exploser? – enenen

+1

Non, mais je me demande s'il existe un moyen de le faire sans utiliser exploser. –

0

cela devrait le faire:

$str = 'Func(param1, param2, param32, param54, param293, par13am, param)'; 
preg_match_all("/(.*)[\(|\](.*)[,|\)]/U", $str, $match); 

print_r($match[1]); 
//output: Array ([0] => Func [1] => param1 [2] => param2 [3] => param32 [4] => param54 [5] => param293 [6] => par13am [7] => param) 
+0

Il n'est pas fixé, j'ai donné ce cas à titre d'exemple. Comment puis-je faire cela sans exploser? Merci. :) –

+0

qui devrait le faire, je l'ai fait à la place preg_match_all, et le tableau que vous voulez est dans $ match [1] – aleation