[英]PHP preg_match part of url
我試圖用PHP創建一個url路由器,就像django一樣。
問題是,我不太清楚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/5/
中的post_id
,以便我可以將5
傳遞給我的方法。
你必須划定正則表達式。 分隔允許您提供“選項”(例如“i”用於不區分大小寫的匹配)作為模式的一部分:
,/post/(?P<post_id>\d+)/,
在這里,我用逗號分隔了正則表達式。
正如你發布的那樣,你的正則表達式用/分隔,這意味着它在第二個/作為'選項'之后處理所有內容,並且只嘗試匹配“post”部分。
根據您當前的正則表達式,您嘗試匹配的示例看起來並不是您實際執行的操作。
如果你正在使用匹配類似的正則表達式;
/post/P1234/
然后,以下內容:
preg_match(',/post/(P\d+)/,', '/post/P1234/', $matches);
print_r($matches);
將導致:
Array
(
[0] => /post/P1234/
[1] => P1234
)
希望能為你清除它:)
編輯
根據您對OP的評論,您只是嘗試匹配URL的/ post /部分后面的數字,因此這個稍微簡化的版本:
preg_match(',/post/(\d+)/,', '/post/1234/', $matches);
print_r($matches);
將導致:
Array
(
[0] => /post/1234/
[1] => 1234
)
如果您的第二個RegExp旨在匹配像/ article / slug-goes-here /這樣的網址,那么正確的正則表達式是
#\/article\/[\w-]+\/#
應該這樣做! 我不太確定必須逃避/,所以你可以嘗試不逃避它們。 標記Im guessing是從.NET示例中提取的,因為該框架使用此類標記來命名匹配組。
我希望我可以幫忙!
php 5.2.2:命名子模式現在接受語法
(?<name>)
和(?'name')
以及(?P<name>)
。 以前的版本只接受(?P<name>)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.