2013-10-28 38 views
0

我想了解路由器如何在Kohana中工作。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函數結果的

幾個例子//測試/! => //測試/#!

//測試/!#$ => //測試/!#\ $

//測試/!#$%^ * & AAA()BBB => //測試/!#\ $ %\^& * aaa()bbb

+1

謝謝非常匹配...花費試驗reqexp .. –