2011-06-22 74 views
1

我試圖路由器的URL如下:笨路由(正則表達式)

domain.com/param/some_controller/method/

映射到

some_controller::method($param)

我不是熟練使用正則表達式,這是我我相當肯定有必要,所以如果有人能幫助我開始,我將不勝感激。或者讓我指出一個好的教程或例子?

+0

是'domain.com/param/some_controller/method /'這是popul的字符串變成了一個特定的變量?就像,我可以假設'http(s)://協議永遠不會在那裏,字符串將始終是在那個確切的格式,或不? (我對CI不熟悉) – Wiseguy

+0

@Wiseguy - 所有這些都由CI處理,並且還有一些重寫規則,所以url是_actually_' domain.com/index.php?param/some_controller/method' – tbridge

回答

0

同樣的效果,但笨風格:

//remember that custom routes need to go _after_ ci's default routes, as they're executed in the order you provide them 
$route['default_controller'] = "welcome"; 
$route['404_override'] = ''; 
//exception 1 to your regex here 
//exception 2 to your regex here 
//so on... 
$route['(:any)/(:any)/(:any)'] = "$2/$3/$1"; 
1

這有點麻煩,因爲目前沒有辦法做到這一點與路由沒有混淆的事情。你可以試試這個:

$route['([^/]+)/([^/]+)/([^/]+)'] = "$2/$3/$1"; 

但是這就是說它適用於任何網址:這會混淆正規的控制器。您行走更好地加入一些前綴標識,你應該用這條路線處理請求:例如

$route['a/([^/]+)/([^/]+)/([^/]+)'] = "$2/$3/$1"; 
+0

如果我只是命令所有常規控制器在此之上呢?難道他們不會採取匹配的第一條路線嗎? – tbridge

+0

那麼,如果你列出了每一個網址,你可能會超過這個,然後是的。這似乎是一個痛苦的大量的網址,但如果你只有5或10甚至20甚至可怕。 – Femi

+0

@ Femi - 是的,最有可能少於5個,大概只有2或3個例外!我會很快嘗試你的方法 – tbridge

2
$route['(:any)/some_controller/method/'] = "some_controller/method/$1"; 

如果你的參數是一個數改爲使用(:num)

在控制器

function method($my_param) { 
    echo 'my param is '. $my_param; 
} 

的RL例如:

$route['(:num)/blog/entry/'] = "blog/view/$1"; 

class Blog extends CI_Controller { 

    function view($id) { 
     echo 'fetching blog entry no ' . $id; 
    } 
} 

你的觀點會像

view.php

<html> 
<body> 
link to <?= anchor('1/blog/entry/','my first post'); ?> 
link to <?= anchor('2/blog/entry/','my second post'); ?> 
</body> 
</html>