2010-11-18 85 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示例中提取的,因爲該框架使用這樣的標籤來命名匹配的組。

我希望我能幫上忙!