2013-11-24 54 views
2

我試圖創建一個非常簡單的URL路由和我的思維過程是這樣的:自定義URL路由使用PHP和正則表達式

  • 首先檢查所有靜態URL
  • 然後檢查數據庫URL
  • 如果都不存在,則返回404

靜態URL當然很容易做到,但我試圖找出做動態URL的最佳方法。我寧願不必設置靜態前綴,儘管知道它會使編碼更容易。

這是我目前有:

$requestURL = $_SERVER['REQUEST_URI']; 

if ($requestURL == '/') { 
    // do stuff for the homepage 
} 

elseif ($requestURL == '/register') { 
    // do stuff for registration 
} 

// should match just "/some-unique-url-here" 
elseif (preg_match("/([\/A-Za-z0-9\-]+)/",$requestURL)) { 
    // query database for that url variable 
} 

// should match "/some-unique-url/and-another-unique-url" 
elseif (preg_match("(^\/[A-Za-z0-9\-]+\/[A-Za-z0-9\-]+)/",$requestURL)) { 
    // query database for first and second variable 
} 

else { 
    // 404 stuff 
} 

我的問題是,如果我有「/註冊」 URI,它會匹配第二ELSEIF聲明以及正則表達式語句。但我想,以避免不必專門從正則表達式語句中排除的每個靜態URL,比如這個:

// should match just "/some-unique-url-here" 
elseif ((preg_match("/([\/A-Za-z0-9\-]+)/",$requestURL)) && 
    ($requestURL !== '/register') && 
    ($requestURL !== '/')) { 
    // query database for that url variable 
} 

什麼是解決這個問題的最簡單的方法?我可能會擁有15-20個靜態網址,因此特別排除所有這些網址會非常笨拙。

+1

**附註:**就沒有必要逃避連字符'-'在字符類的末尾(或開頭)。另外爲了防止一些混淆,你可以使用其他分隔符而不是正向符號'/',這樣你就不需要在你的表達式中將它們轉義出來了〜〜/ @' – HamZa

+0

@HamZA,很感謝。不知道。 – zen

回答

8

您的問題不存在。如果第一個elseif ($requestURL == '/register')匹配,則不會評估同一級別上的所有後續elseif

您已經在做對了,只要確保先進行字符串比較(==)即可。

另一方面,不要重新發明輪子。

+0

啊啊!愚蠢的我,你是對的! – zen

+0

至於使用其他路由器,我已經檢查了其中的一些,但他們太複雜,我所需要的。 – zen

+4

創建自己的多個理由。如果你可以使用別人的工作,公司希望看到你能做什麼,並且不在乎多少。同時它也是一個很好的學習經驗來創建你自己的。通過這種方式,你將能夠找出你的錯誤,甚至可以找到加速腳本以滿足自己需求的方法。 – NSaid