2012-12-28 392 views
0

更新正則表達式錯誤

當我去/about/,我得到:

Route: contact 
Get Param: about 

當我去/contact/,我得到:

Route: about 
Get Param: contact 


這裏是我的代碼:

foreach ($routes as $route) { 
      if (preg_match('/^' . $route . '$/', $uri)) { 
       $controller = 'controllers/' . $route . '.php'; 

       if (file_exists($controller)) { 
        include_once($controller); 
       } else { 
        echo '<h1>404 - Missing Controller</h1>'; 
       } 
      } else { 
       echo '<h1>404 - Missing Route</h1>'; 
      } 
} 

問題是,我經常看到「失蹤之路」 ......這裏有什麼我的問題?

我得到了同樣的問題,如果我有if ($uri == $route)

$航線更換preg_match = Array ([0] => about [1] => contact)
$ URI = contact

目錄結構:

控制器/
     關於。 php
      Contact.php
Router.php

感謝您的幫助!

+4

那麼你的第一個問題是缺少'$ route'和'$ uri'的例子。 ;) – SenorAmor

+0

請發佈一些'$ route'的例子,預期的行爲和結果行爲,以及一個文件系統的例子,以及'$ uri'的值。我們需要儘可能多的信息。 – FrankieTheKneeMan

+0

啊,對不起,夥計們!添加。 :) – user1453094

回答

1

您的其他條件正在執行除了匹配的每個索引。

什麼,我認爲你需要做的是:

if(in_array($uri, $routes) { 
      $controller = 'controllers/' . $uri . '.php'; 
      if (file_exists($controller)) { 
       include_once($controller); 
      } else { 
       echo '<h1>404 - Missing Controller</h1>'; 
      } 
} 
else { 
      echo '<h1>404 - Missing Route</h1>'; 
     } 

另外,如果你的控制器名稱以大寫字母開始,你需要一些邏輯添加到製作$控制變量,它大寫的第一個字符。

+0

你先生,是個天才!非常感謝你! – user1453094

+0

很高興我能幫忙。 –

1

你爲什麼要用preg_match?

if (preg_match('/^' . $route . '$/', $uri)) 

相同

if ($route == $uri) 

除非出於某種原因,你想$route有正則表達式元字符在裏面。

此外,你的輸出說你有404,但你實際上是否返回404的HTTP響應?

+0

我正在使用'preg_match',因爲我打算將其擴展爲只允許某些字符。另外,404不是問題 - 爲了簡單起見,我編輯了該代碼。無論哪種方式我都會得到相同的結果 – user1453094

+0

試過你的($ route == $ uri)方法,我仍然遇到同樣的問題。 :S – user1453094

+0

我不是故意建議它可以解決你的問題,只是你做了不必要的正則表達式匹配。 –