2012-11-07 182 views
2

我正在尋找一些正則表達式的幫助。帶括號的正則表達式

我有這樣一段代碼:

$router->add( 
    '/activate/{token:[a-zA-Z0-9]+}', 
    array (
     'module' => 'frontend', 
     'controller' => 'user', 
     'action'  => 'activate' 
    ) 
); 

它工作得很好。但是下面的一個不:

$router->add( 
    '/activate/{token:[a-zA-Z0-9]{32}}', 
    array (
     'module' => 'frontend', 
     'controller' => 'user', 
     'action'  => 'activate' 
    ) 
); 

的匹配機制,我在C是(與preg_match_all也適用)

'#{([a-zA-Z][a-zA-Z0-9\_\-]*)(:([^}]+))*}#' 

我將不勝感激一些指引,以如何讓第二個例子工作。

編輯

preg_match_all(
    '#{([a-zA-Z][a-zA-Z0-9\_\-]*)(:([^}]+))*}#', 
    '/manual/{language:[a-z]{2}}/{file:[a-z]+}.html', 
    $matches, 
    PREG_SET_ORDER 
); 

我希望它這樣返回的東西:

Array 
(
    [0] => Array 
     (
      [0] => {language:[a-z]{2}} 
      [1] => language 
      [2] => :[a-z]{2} 
      [3] => [a-z]{2} 
     ) 
    [1] => Array 
     (
      [0] => {file:[a-z]+} 
      [1] => file 
      [2] => :[a-z]+ 
      [3] => [a-z]+ 
     ) 
) 
+1

我看不到'C' ... – alk

+2

您在第二個示例中匹配的令牌是否只是[a-zA-Z0-9]的32個字符?什麼路線不符合,是否因爲另一條路線優先,因爲它們是模糊的? – drew010

+1

請添加一些示例,顯示第一個作品和第二個作品沒有的文字。 –

回答

2

這個正則表達式:「#{(A-ZA-Z0-9_-] ) (:(。)}?)}#'適用於他們兩人:

<?php 

preg_match_all(
    '#{([a-zA-Z0-9\_\-]*)(:([^}]+}?))*}#', 
    '/activate/{token:[a-zA-Z0-9]{32}}', 
    $matches, 
    PREG_SET_ORDER 
); 
print_r($matches); 

preg_match_all(
    '#{([a-zA-Z0-9\_\-]*)(:([^}]+}?))*}#', 
    '/activate/{token:[a-zA-Z0-9]+}', 
    $matches, 
    PREG_SET_ORDER 
); 
print_r($matches);