PHP роутер без регулярных выражений - PullRequest
1 голос
/ 23 августа 2011

Я работаю над модным классом маршрутизатора / диспетчера уже несколько недель, пытаясь решить, как я этого хочу, я получил идеальное IMO, за исключением того, что мне не нужна производительность.Он использует карту маршрутов arrap = / forums / viewthread /: id /: page => 'forums / viewthread / (? \ D +)' и просматривает массив карт с помощью регулярных выражений, чтобы найти совпадение. Я пытаюсь найти что-то лучшеена сайте с большим трафиком, вот начало ...

$uri = "forum/viewforum/id-522/page-3";

$parts = explode("/", $uri);
$controller = $parts['0'];
$method = $parts['1'];
if($parts['2'] != ''){
    $idNumber = $parts['2'];
}

if($parts['3'] != ''){
    $pageNumber = $parts['3'];
}

Где мне нужна помощь, это когда-нибудь идентификатор, и страница не будет присутствовать когда-нибудь, одна или другая, а иногда и обе, так что обвиоулс мой вышекод не покрывает это, он предполагает, что элемент массива 2 всегда является идентификатором, а 3 - всегда страницей, может кто-нибудь показать мне практический способ сопоставления страницы и идентификатора с переменной, только если они существуют в URI и без использования обычноговыражения?

Вы можете увидеть, что у меня есть на моих версиях регулярных выражений в этом вопросе Это хороший способ сопоставить URI с классом / методом в PHP для MVC

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Это кажется более продолжительным:

$parts = explode("/", $uri);
$parts_count=count($parts);
//set default values
$page_info=array('id'=>0,'page'=>0);
for($i=2;$i<$parts_count;$i++) {
    if(strpos($parts[$i],'-')!==FALSE) {
        list($info_type,$info_val)=explode('-',$parts[$i],2);
        if(isset($page_info[$info_type])) {
            $page_info[$info_type]=(int)$info_val;
        }
    }
}

тогда просто используйте значения $ page_info. Таким образом, вы можете легко добавить другие значения и больше уровней '/'.

1 голос
/ 23 августа 2011
if ( ! empty($parts['2']))
{
    if (strpos($parts['2'], 'id-') !== FALSE)
    {
        $idNumber = str_replace('id-', '', $parts['2']);
    }
    elseif (strpos($parts['2'], 'page-') !== FALSE)
    {
        $pageNumber = str_replace('id-', '', $parts['2']);
    }
}

И сделать то же самое для $ part [3]

...