如何修复这个正则表达式?

时间:2009-08-12 14:31:37

标签: php regex

我有一个正则表达式来从URI中删除某些部分。然而,它没有考虑多种部件的工作方式:-)。有人可以帮忙吗?

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

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

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

我知道它与以下部分匹配为一个匹配:

  

/ {动作} / {ID} / {子动作}

但它应该与以下两个分开匹配:

  

/ {ID} *

     

/ {子动作} *

1 个答案:

答案 0 :(得分:6)

对我而言,您的{(.*?)}\*测试似乎与{action}/{id}*的所有测试相匹配,从您所写的内容来看,这不是您想要的。

所以改变Kleene闭包不要贪心:

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

但是你真的需要捕捉花括号里面的部分吗?在我看来,你可以选择这个:

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

无论哪种方式,[^}]*部分都保证表达式不匹配{action}/,因为它不以星号结尾。