Маршрутизатор Php, извлекая ключи из uri

Если вам нужна только точность с точностью до секунды, вы можете использовать встроенную переменную $SECONDS, которая подсчитывает количество секунд, в течение которых была запущена оболочка.

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done
6
задан 2 July 2009 в 11:30
поделиться

4 ответа

Попробуйте это простое решение:

    $data = Array (
            "/book/:id/:category/:keyname" => "/book/12345/php/this-is-a-test-keyname",
            "/book-:id/:category/:keyname" => "/book-12345/php/this-is-a-test-keyname",
            "/book/:id_:category~:keyname" => "/book/12345_php~this-is-a-test-keyname",
    );


    foreach ($data as $rule => $uri) {
            $reRule = preg_replace('/:([a-z]+)/', '(?P<\1>[^/]+)', $rule);
            $reRule = str_replace('/', '\/', $reRule);

            preg_match('/' . $reRule .'/', $uri, $matches);
            print_r($matches);
    }

Единственным недостатком является то, что у вас не может быть модной проверки данных на этом этапе, поэтому вам придется сделать это в другом месте. Также может возникнуть путаница, если правила конфликтуют с синтаксисом регулярного выражения (здесь вам придется проделать тяжелую работу по экранированию).

1
ответ дан 17 December 2019 в 18:19
поделиться

Я бы начал с определения некоторых шаблонов для каждого элемента

$element=array(
    'id'=>'(\d+)',
    'category'=>'([^/]+)'
);

Затем построил регулярное выражение

$rule="/book-:id/:category/:keyname";

$pattern=preg_quote($rule);
$map=array();
$map[]=null;

function initrule($matches) 
{
    //forgive the globals - quickest way to demonstrate this, in
    //production code I'd wrap this into a class...
    global $element;
    global $map;

    //remember the order we did these replacements
    $map[]=$matches[1];

    //return the desired pattern
    return $element[$matches[1]];
}

$pattern=preg_replace_callback('/:(\w+)/', "initrule", $pattern);

Обратите внимание, что вы можете использовать этот шаблон для ваших целевых данных, и массив совпадений вы получите обратно должно соответствовать именам элементов в массиве $ map - например, имя $ match [1] находится в $ map [1] и т. д.

0
ответ дан 17 December 2019 в 18:19
поделиться

Я не думаю, что это возможно с помощью всего лишь одного регулярного выражения. Zend Framework работает так же, как ваш пример. Взгляните на их исходный код .

1
ответ дан 17 December 2019 в 18:19
поделиться

У меня есть скрипт другой версии: http://blog.sosedoff.com/2009/09/20/rails-like-php-url-router/

1
ответ дан 17 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: