2016-02-26 128 views
1

我在ZF2應用程序的工作,我需要這樣的路線:ZF2分段路由約束正則表達式

'storage-deliver' => array(
    'type' => 'Segment', 
    'options' => array(
     'route' => '/storage/:uuid/:path', 
     'constraints' => array(
      'uuid' => '[a-zA-Z0-9-]*', 
      'path' => '[a-zA-Z0-9-_\./\+]*' 
     ), 
     'defaults' => array(
      'controller' => 'StorageController', 
      'action' => 'deliver', 
     ) 
    ) 
) 

路線應該能夠匹配uuid約束後面的任何途徑。

例子:

/storage/0e529c8b-2403-40c1-a5bf-c6819e992079/some.file 
/storage/0e529c8b-2403-40c1-a5bf-c6819e992079/an/undefined/depth/path/to/some.file 

我知道UUID約束是不正確的,但現在不相關的我的問題。問題是定義的限制path。它應該能夠匹配給定url的其餘部分。

到目前爲止,給定的定義[a-zA-Z0-9-_\./\+]*的作品(至少對於我使用的例子),但我相當確定有一種方法可以以更好的方式做到這一點(以及真正匹配所有有效可能性的方式!)。

別的地方在這裏,我發現了以下航線例如:

/storage/:uuid/:path{-} 

首先一切都看起來不錯,但path並沒有在所有的情況下匹配。

歡迎任何幫助!

謝謝!

+1

如果路徑必須匹配任何東西,用'。*'或'。+'替換模式,或者(如果除'/'之外應該有其他東西) - ''[^ /] *' –

+0

好!按預期工作。首先,我嘗試了'[\ s \ S] *',這也是可行的,但'。*'似乎更清晰。感謝那。將您的評論轉換爲答案,以便我可以接受! :) – Marco

+0

我不確定我是否正確地閱讀了這個問題,但爲什麼在'path'部分使用任何約束?你的目標不是讓這部分不受約束嗎? – Sebi

回答

1

要匹配任意字符,但換行,你總是可以依靠貪婪點匹配模式:

.* 

這種模式可以匹配一個空字符串,所以,如果你不希望出現這種情況,則更換*(這意味着*零次或多次出現)與+量詞(意味着一次或多次出現)。