2013-10-28 4 views
0

나는 Kohana에서 라우터가 어떻게 작동하는지 이해하려고합니다.라우터 :: 컴파일

나는 ... 메소드 컴파일과에 걸어 어려움에 직면 여기이 줄을 만드는 것

:

$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로 실험 해보십시오. –

관련 문제