2010-11-18 64 views
3

我想在PHP中创建一个url路由器,就像django的一样。PHP preg_match url的一部分

问题是,我不太了解php正则表达式。

我希望能够匹配这样的网址:

/post/5/ 
/article/slug-goes-here/ 

我有正则表达式的数组:

$urls = array(  
    "(^[/]$)" => "home.index",  
    "/post/(?P<post_id>\d+)/" => "home.post",  
); 

数组中的第一个正则表达式的工作相匹配的家页面/但我不能得到第二个工作。

下面是我使用,以配合它们的代码:

foreach($urls as $regex => $mapper) { 
    if (preg_match($regex, $uri, $matches)) { 
    ... 
    } 
} 

我也应该注意到,在上面的例子中,我试图在URL中post_id匹配:/post/5/,这样我可以通过5沿着我的方法。

+0

正则表达式应该有适当的分隔符 – stillstanding 2010-11-18 05:37:09

回答

3

您必须划定正则表达式。划定允许你提供“选项”(如“我”为不区分大小写的匹配)作为模式的一部分:

,/post/(?P<post_id>\d+)/, 

在这里,我已经分隔用逗号分隔的正则表达式。

正如你已经发布它,你的正则表达式正在用/分隔,这意味着它将第二个/作为'选项'后的所有内容都对待,并且只尝试匹配“后”部分。

你试图匹配的例子看起来不像你实际上基于你当前的正则表达式。

如果你是在一个正则表达式匹配类似的东西之后;

/post/P1234/ 

然后执行以下操作:

preg_match(',/post/(P\d+)/,', '/post/P1234/', $matches); 
print_r($matches); 

将导致:

Array 
(
    [0] => /post/P1234/ 
    [1] => P1234 
) 

希望这清除它适合你:)

编辑

根据您的OP的评论,你只是想匹配的URL /后/部分之后的数,所以这个略微简化的版本:

preg_match(',/post/(\d+)/,', '/post/1234/', $matches); 
print_r($matches); 

将导致:

Array 
(
    [0] => /post/1234/ 
    [1] => 1234 
) 
+0

唉唉,你让我的夜晚,谢谢!我希望我能给你20票。 – imns 2010-11-18 06:10:16

+0

不是一个问题 - 当我第一次开始时,分隔正则表达式刺激了我很多次,并且在php.net上也没有任何解释。 – 2010-11-18 06:13:49

1

如果你的第二个正则表达式是为了匹配像/条的URL /鼻涕虫去,这里/,那么正确的正则表达式

#\/article\/[\w-]+\/# 

应该这样做!我不确定要逃避/,所以你可以尝试不逃避它们。 Im猜测是从.NET示例中提取的,因为该框架使用这样的标签来命名匹配的组。

我希望我能帮上忙!