Если вам нужна только точность с точностью до секунды, вы можете использовать встроенную переменную $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
Попробуйте это простое решение:
$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);
}
Единственным недостатком является то, что у вас не может быть модной проверки данных на этом этапе, поэтому вам придется сделать это в другом месте. Также может возникнуть путаница, если правила конфликтуют с синтаксисом регулярного выражения (здесь вам придется проделать тяжелую работу по экранированию).
Я бы начал с определения некоторых шаблонов для каждого элемента
$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] и т. д.
Я не думаю, что это возможно с помощью всего лишь одного регулярного выражения. Zend Framework работает так же, как ваш пример. Взгляните на их исходный код .
У меня есть скрипт другой версии: http://blog.sosedoff.com/2009/09/20/rails-like-php-url-router/