2009-08-12 14 views
1

J'ai une expression régulière pour supprimer certaines parties d'un URI. Cependant, il ne prend pas en compte plusieurs parties d'une manière qui fonctionne :-). Quelqu'un peut-il aider?Comment réparer cette expression régulière?

$regex = '~/{(.*?)}\*~' 

$uri = '/user/{action}/{id}*/{subAction}*'; 
$newuri = preg_replace($regex, '' , $uri); 

//$newuri = /user/ 
//Should be: $newuri = /user/{action}/ 

Je sais qu'elle correspond à la partie suivante comme un match:

/{action}/{id} /{sous-action}

Mais il doit correspondre à ce qui suit deux séparément:

/{id} *

/{} * Sous-action

Répondre

6

Pour moi, il ressemble à votre test {(.*?)}\* est correspondant à tous {action}/{id}*, qui d'après ce que vous avez écrit est pas ce que vous voulez.

donc changer la fermeture Kleene être moins gourmand:

'~/{([^}]*)}\*~' 

Mais avez-vous vraiment besoin de saisir la partie à l'intérieur des accolades? Il me semble que vous pourriez aller avec celui-ci à la place:

'~/{[^}]*}\*~' 

Quoi qu'il en soit, la partie [^}]* garantit que l'expression ne correspond pas à {action}/ parce qu'il ne se termine pas par un astérisque.

+0

Merci d'avoir réfléchi! C'est exactement ce dont j'ai besoin! – Ropstah