2013-04-28 40 views
0

现在尝试几个小时,但现在我承认我卡住了。preg_match命名的子模式 - 可选键

我想匹配一个简单的框架的网址模式。

$url = 'controller'; 
preg_match('/(?P<controller>\w+)/', $url, $matches); 

这适用于网页没有斜线,但我想用可选的键

$url = 'controller/action'; 
preg_match('/(?P<controller>(?P<action>)?\w+)/', $url, $matches); 

匹配诸如控制器/操作URL这是问题所在。我无法弄清楚如何使斜杠前面的'动作'键成为可选项。

回答

2

尝试

preg_match('/(?P<controller>\w+)(?P<action>\/\w+)?/', $url, $matches); 

,你必须符合最初的第一部分(?P<controller>\w+),然后关闭捕获组。然后这部分您的可选部分开始(?P<action>\/\w+)?包括斜线和再次\w+

如果你不想在截取部分的斜线,放了第二组周围是可选的,从捕获组移动斜线可选一个:

preg_match('/(?P<controller>\w+)(?:\/(?P<action>\w+))?/', $url, $matches); 

A组开始?:是一个非捕获组。

+0

它的工作:)行动匹配为'/富',有没有办法省略斜杠 – user2329731 2013-04-28 18:27:51

+0

我已经扩展了我的答案。 – stema 2013-04-28 18:28:17

+0

谢谢!这很混乱。我可能永远不会自己拿到它。 – user2329731 2013-04-28 18:31:30