簡體   English   中英

PHP preg_match url的一部分

[英]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>)

http://php.net/manual/fr/function.preg-match.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM