2013-10-28 3 views
0

Я пытаюсь понять, как работает маршрутизатор в Кохане.Router :: compile

Я подошел к методу компиляции и и сталкиваются с трудностями ...

Что делает эту линию здесь:

$expression = preg_replace('#'.Route::REGEX_ESCAPE.'#', '\\\\$0', $uri); 

Метод компиляции:

public static function compile($uri, array $regex = NULL) 
    { 
     // The URI should be considered literal except for keys and optional parts 
     // Escape everything preg_quote would escape except for : () < > 
     $expression = preg_replace('#'.Route::REGEX_ESCAPE.'#', '\\\\$0', $uri); 

     if (strpos($expression, '(') !== FALSE) 
     { 
      // Make optional parts of the URI non-capturing and optional 
      $expression = str_replace(array('(', ')'), array('(?:', ')?'), $expression); 
     } 

     // Insert default regex for keys 
     $expression = str_replace(array('<', '>'), array('(?P<', '>'.Route::REGEX_SEGMENT.')'), $expression); 

     if ($regex) 
     { 
      $search = $replace = array(); 
      foreach ($regex as $key => $value) 
      { 
       $search[] = "<$key>".Route::REGEX_SEGMENT; 
       $replace[] = "<$key>$value"; 
      } 

      // Replace the default regex with the user-specified regex 
      $expression = str_replace($search, $replace, $expression); 
     } 

     return '#^'.$expression.'$#uD'; 
    } 



const REGEX_ESCAPE = '[.\\+*?[^\\]${}=!|]'; 

Может подскажете отдельную статью, поможет мне понять?

ответ

2
// What must be escaped in the route regex 
const REGEX_ESCAPE = '[.\\+*?[^\\]${}=!|]'; 

// The URI should be considered literal except for keys and optional parts 
// Escape everything preg_quote would escape except for : () < > 
$expression = preg_replace('#'.Route::REGEX_ESCAPE.'#', '\\\\$0', $uri); 

Эта часть кода означает, что все символы (кроме круглых и угловых скобок) будут экранированы. Это помогает обнаружить знак вопроса или точку в определенном маршруте.

\\\\$0 

Чтобы использовать обратную косую черту, вам необходимо продублировать его в вашем regexpr.

Несколько примеров результата с использованием этого preg_replace:

тест => Тест

тест/=> Тест/

// Тест/=> // Тест/

//контрольная работа/! => // test/#!

// тест /! # $ => // тест/#! \ $

// тест /! # $%^& * ааа() ГЭБ => // тест/#! \ $ % \^& * aaa() bbb

+1

Большое спасибо ... Проведите эксперимент с reqexp .. –