modrewrite для умных URL | несколько переменных? - PullRequest
0 голосов
/ 05 августа 2011

Каков наилучший способ сделать это?

Я планирую сделать какой-нибудь умный modrewrite + функцию для получения имени переменной из URL.

Например:

URL-адрес, такой как: domain.com/page-blog/id-5/title-a_blog_title/date-2011_08_05

Вернется:

$urlvariable = page-blog/id-5/title-a_blog_title/date-2011_08_05

Затем я запусту функцию, которая будет анализировать переменную $ urlvariable и вернуть

$urlvariable['page'] = blog
$urlvariable['id'] = 5
$urlvariable['title'] = a_blog_title
$urlvariable['date'] = 2011_08_05

Но перезапись должна быть в состоянии обрабатывать меньшие или большие URL, такие как: domain.com/page-blog/id-5/

возвращение:

$urlvariable = page-blog/id-5/

или также: domain.com/page-blog/id-5/title-a_blog_title/date-2011_08_05/var1-foo/var2-bar/var3-xpto/var4-xyz и т. д. *

$urlvariable = page-blog/id-5/title-a_blog_title/date-2011_08_05/var1-foo/var2-bar/var3-xpto/var4-xyz

Есть ли способ сделать это? Какое будет выражение для перезаписи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 августа 2011

RiaD имеет правильную идею, используя explode вместо регулярных выражений (поскольку регулярные выражения медленнее).

Однако, вы все равно можете использовать регулярные выражения для «нормализации» URL. Но после этого вы все равно можете использовать explode для небольшого увеличения скорости или сделать что-то вроде этого

$url = "page-blog/id-5/blank-/title-a_blog_title/date-2011_08_05/var1-foo/var2-bar/var3-xpto/var4-xyz";

$url = preg_replace("~//+~", '/', $url); // remove multiple consequtive slashes

$params = array();
if( preg_match_all("~(\w+)-([^/]*)~", $url, $params) ) {
    $params = array_combine($params[1], $params[2]);
    print_r($params);
}

Будет напечатано:

Array(
    [page] => blog
    [id] => 5
    [blank] => 
    [title] => a_blog_title
    [date] => 2011_08_05
    [var1] => foo
    [var2] => bar
    [var3] => xpto
    [var4] => xyz
)
0 голосов
/ 05 августа 2011

Что касается меня, лучший способ - перенаправить все запросы на ваш скрипт php / another_language, а затем использовать что-то вроде этого:

for($i=1,$arr=explode('/',$_SERVER['REQUEST_URI']),$s=count($arr);$i<$s;++$i){  //avoid 0(empty part) and 1(script name)
     $tmp=explode(' ',$arr[$i]);
     $get[$tmp[0]]=$tmp[1];
}
...