@@ -18,98 +18,93 @@ public function __construct($url, $callback) {
18
18
$ this ->settings ['aliases ' ] = array ();
19
19
}
20
20
21
- protected function parseParameters ($ url , $ multiple = false , $ regex = self ::PARAMETERS_REGEX_MATCH ) {
22
- $ url = rtrim ($ url , '/ ' );
23
- $ parameters = array ();
21
+ public function matchRoute (Request $ request ) {
24
22
25
- if ($ multiple ) {
26
- preg_match_all ('/ ' .$ regex .'/is ' , $ url , $ parameters );
27
- } else {
28
- preg_match ('/ ' .$ regex .'/is ' , $ url , $ parameters );
29
- }
23
+ $ url = parse_url ($ request ->getUri ());
24
+ $ url = rtrim ($ url ['path ' ], '/ ' ) . '/ ' ;
30
25
31
- if (isset ($ parameters [1 ]) && count ($ parameters [1 ]) > 0 ) {
32
- return $ parameters [1 ];
26
+ // Match on custom defined regular expression
27
+ if ($ this ->regexMatch ) {
28
+ $ parameters = array ();
29
+ if (preg_match ('/ ' .$ this ->regexMatch .'/is ' , $ url , $ parameters )) {
30
+ $ this ->parameters = $ parameters [0 ];
31
+ return $ this ;
32
+ }
33
33
}
34
34
35
- return null ;
36
- }
37
-
38
- public function matchRoute (Request $ request ) {
39
-
40
- // Check if request method is allowed
41
-
42
- $ url = parse_url ($ request ->getUri ());
43
- $ url = $ url ['path ' ];
35
+ // Make regular expression based on route
44
36
45
37
$ route = rtrim ($ this ->url , '/ ' ) . '/ ' ;
46
38
47
- $ routeMatch = preg_replace ('/\/{0,1} ' .self ::PARAMETERS_REGEX_MATCH .'\/{0,1}/is ' , '' , $ route );
48
-
49
- $ tmp = explode ('/ ' , $ route );
50
- $ tmp2 = explode ('/ ' , $ url );
39
+ $ parameterNames = array ();
40
+ $ regex = '' ;
41
+ $ lastCharacter = '' ;
42
+ $ isParameter = false ;
43
+ $ parameter = '' ;
51
44
52
- // Check if url parameter count matches
53
- if (stripos ($ url , $ routeMatch ) === 0 || count ($ tmp ) === count ($ tmp2 )) {
45
+ for ($ i = 0 ; $ i < strlen ($ route ); $ i ++) {
54
46
55
- $ matches = true ;
47
+ $ character = $ route [ $ i ] ;
56
48
57
- if ($ this ->regexMatch ) {
58
- $ parameters = $ this ->parseParameters ($ url , true , $ this ->regexMatch );
49
+ // Skip "/" if we are at the end of a parameter
50
+ if ($ lastCharacter === '} ' && $ character === '/ ' ) {
51
+ $ lastCharacter = $ character ;
52
+ continue ;
53
+ }
59
54
60
- // If regex doesn't match, make sure to return an array
61
- if (!is_array ($ parameters )) {
62
- $ parameters = array ();
55
+ if ($ character === '{ ' ) {
56
+ // Remove "/" and "\" from regex
57
+ if (substr ($ regex , strlen ($ regex )-1 ) === '/ ' ) {
58
+ $ regex = substr ($ regex , 0 , strlen ($ regex ) - 2 );
63
59
}
64
60
65
- } else {
66
-
67
- $ matches = (count (explode ('/ ' , rtrim ($ url , '/ ' ))) == count (explode ('/ ' , rtrim ($ route , '/ ' ))));
68
-
69
- $ url = explode ('/ ' , $ url );
70
- $ route = explode ('/ ' , rtrim ($ route , '/ ' ));
71
-
72
- $ parameters = array ();
61
+ $ isParameter = true ;
62
+ } elseif ($ isParameter && $ character === '} ' ) {
63
+ // Check for optional parameter
64
+ if ($ lastCharacter === '? ' ) {
65
+ $ parameter = substr ($ parameter , 0 , strlen ($ parameter )-1 );
66
+ $ regex .= '(?:(?:\/(?P< ' .$ parameter .'>[0-9]*?)){0,1} \\/) ' ;
67
+ } else {
68
+ // Use custom parameter regex if it exists
69
+ $ parameterRegex = '[0-9]*? ' ;
70
+
71
+ if (is_array ($ this ->parametersRegex ) && isset ($ this ->parametersRegex [$ parameter ])) {
72
+ $ parameterRegex = $ this ->parametersRegex [$ parameter ];
73
+ }
73
74
74
- // Check if url matches
75
- foreach ($ route as $ i => $ path ) {
76
- $ parameter = $ this ->parseParameters ($ path , false );
75
+ $ regex .= '(?: \\/(?P< ' . $ parameter . '> ' . $ parameterRegex .') \\/) ' ;
76
+ }
77
+ $ parameterNames [] = $ parameter ;
78
+ $ parameter = '' ;
79
+ $ isParameter = false ;
80
+
81
+ } elseif ($ isParameter ) {
82
+ $ parameter .= $ character ;
83
+ } elseif ($ character === '/ ' ) {
84
+ $ regex .= '\\' . $ character ;
85
+ } else {
86
+ $ regex .= $ character ;
87
+ }
77
88
78
- // Check if parameter of path matches, otherwise quit..
79
- if (is_null ($ parameter ) && strtolower ($ path ) != strtolower ($ url [$ i ])) {
80
- $ matches = false ;
81
- break ;
82
- }
89
+ $ lastCharacter = $ character ;
90
+ }
83
91
84
- // Save parameter if we have one
85
- if ($ parameter ) {
86
- $ parameterValue = $ url [$ i ];
87
- $ regex = (isset ($ this ->parametersRegex [$ parameter ]) ? $ this ->parametersRegex [$ parameter ] : null );
92
+ $ parameterValues = array ();
88
93
89
- if ($ regex !== null ) {
90
- // Use the regular expression rule provided to filter the value
91
- $ matches = array ();
92
- preg_match ('/ ' . $ regex . '/is ' , $ url [$ i ], $ matches );
94
+ if (preg_match ('/^ ' .$ regex .'$/is ' , $ url , $ parameterValues )) {
93
95
94
- if (count ($ matches )) {
95
- $ parameterValue = $ matches [0 ];
96
- }
97
- }
96
+ $ parameters = array ();
98
97
99
- // Add parameter value, if it doesn't exist - replace it with null value
100
- $ parameters [ $ parameter ] = ( $ parameterValue === '' ) ? null : $ parameterValue ;
101
- }
98
+ if ( count ( $ parameterNames )) {
99
+ foreach ( $ parameterNames as $ name ) {
100
+ $ parameters [ $ name ] = isset ( $ parameterValues [ $ name ]) ? $ parameterValues [ $ name ] : null ;
102
101
}
103
102
}
104
103
105
- // This route matches
106
- if ($ matches ) {
107
- $ this ->parameters = $ parameters ;
108
- return $ this ;
109
- }
104
+ $ this ->parameters = $ parameters ;
105
+ return $ this ;
110
106
}
111
107
112
- // No match here, move on...
113
108
return null ;
114
109
}
115
110
@@ -126,7 +121,11 @@ public function getUrl() {
126
121
*/
127
122
public function setUrl ($ url ) {
128
123
129
- $ parameters = $ this ->parseParameters ($ url , true );
124
+ $ parameters = array ();
125
+
126
+ preg_match_all ('/ ' .self ::PARAMETERS_REGEX_MATCH .'/is ' , $ url , $ parameters );
127
+
128
+ $ parameters = $ parameters [1 ];
130
129
131
130
if ($ parameters !== null ) {
132
131
foreach ($ parameters as $ param ) {
0 commit comments