Для того чтобы это работало, нужно выполнить гораздо больше работы, прежде всего для преобразования маршрута в регулярные выражения, которые затем можно использовать в указанном URI.Я бы сделал это следующим образом:
<code>$routes = $params = array();
$routes[] = '/list/edit/@id:[0-9]{3}';
$routes[] = '/username/@name';
$routes[] = '/archive/*';
$routes[] = '/';
$uri = '/username/carlos';
foreach($routes as $pattern) {
// Convert all characters into safe characters
$pattern = preg_quote($pattern, '~');
// Convert * into .*?
$pattern = preg_replace('/(?<!\\\\)\\\\\*/', '.*?', $pattern);
#echo '<pre>'.print_r($pattern, true).'
';// Преобразовать любое выражение @name: в их выражения для захвата $ pattern = preg_replace_callback ('% @ ([a-zA-Z] +) (\\\\: ([^ /] +))?%', 'regex_callback ', $ pattern);$ pattern = '~ ^'.$ шаблон.'$ ~';if (preg_match ($ pattern, $ uri, $ совпадений)) {$ params = $ совпадений;перерыв;}} echo '
'.print_r($params, true).'
';function regex_callback ($ data) {#echo '
'.print_r($data, true).'
';$ pattern = '[^ /] +';if (! empty ($ data [3])) {$ pattern = stripslashes ($ data [3]);} return '(? P <'. $ data [1]. '>'. $ pattern. ')';}
Преобразует *
в .*?
, а затем преобразует @param в (?P<param>[^/]+)
или подставляет [^/]+
для выражения после :
Если совпадение найдено, оно устанавливает совпадения на $params
и выходит из цикла foreach.Чтобы найти имя, вам просто нужно будет использовать
echo $param['name'];