2016-08-07 50 views
1

我工作的一個PHP MVC路由系統上,我需要我的路由器能夠得到URL的各個部分,並在這個例子中相應的映射像:PHP正則表達式複雜的匹配

url = controller/method/parameters/another/something/page/7 

應該映射到:

controller = controller, method = method, parameters = parameters/another/something, page = 7 

目前我只能用這個正則表達式匹配

controller/method/parameter/page/7 

{controller}/{method}/{parameters:[a-z0-9-]+}/page/{page:\d+} 

換算成這種模式:

/^(?P<controller>[a-z-]+)\/(?P<method>[a-z-]+)\/(?P<parameters>[a-z0-9-]+)\/page\/(?P<page>\d+)$/ 

我使用名爲捕捉得到的部分。我需要使用正則表達式來獲得上述結果的幫助。

+0

到底爲什麼你需要做到這一點在PHP?如果您使用它來重寫網址,您最好使用[.htaccess](/ documentation/.htaccess/topics /)。 –

回答

0

您需要在參數的字符類中允許/ s。

/^(?P<controller>[a-z-]+)\/(?P<method>[a-z-]+)\/(?P<parameters>[a-z0-9\/-]+)\/page\/(?P<page>\d+)$/ 

演示:https://regex101.com/r/nX7cZ8/1

+0

感謝您的答案,獲得理想的結果,但有一點複雜。我如何映射這個:'controller/method/parameters/another/something'而不指定'page/7'。 –

+0

對不起,我修正了上面的問題。我實際上循環了一組像上面的規則格式化的規則,但我希望表達式不要將'controller/method/parameter/another/page/7'解析爲'controller = controller,method = method,parameter = parameter/another/page/7',但是當url中有'page/7'的時候會失效或者不匹配。如果我改變路由表中的路由順序,它的工作原理,但我不想這樣,它必須在所有情況下沒有影響匹配的順序。 –