Как сделать регулярные выражения для захвата маршрутов - PullRequest
1 голос
/ 12 ноября 2011

любой может помочь мне с этой проблемой.

example $uri = '/username/carlos'; => $routes[] = '/username/@name';

@ name преобразуется в переменную $ name Захватывающая строка "carlos"

$routes[] = '/list/edit/@id:[0-9]{3}';

$routes[] = '/username/@name';

$routes[] = '/archive/*';

$routes[] = '/';


$uri = '/username/carlos';

foreach ( $routes as $pattern )
{
    if ( preg_match( '#^' . preg_replace( '#(?:{{)?@(\w+\b)(?:}})?#i', '(?P<\1>[\w\-\.!~\*\'"(),\s]+)',
                            str_replace( '\*', '(.*)', preg_quote( $pattern, '/' ) ) ) . '\/?$#i', $uri, $matchs ) )
    {

        //how to make regex for this to work :


        echo $name; // carlos =>$uri = '/username/carlos'; or matt => $uri = '/username/matt';

    }
}

спасибо за чтение

1 Ответ

1 голос
/ 26 ноября 2011

Для того чтобы это работало, нужно выполнить гораздо больше работы, прежде всего для преобразования маршрута в регулярные выражения, которые затем можно использовать в указанном 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'];
...