1818 * @author liu21st <liu21st@gmail.com>
1919 */
2020class CheckRouteBehavior extends Behavior {
21+
22+ private $ matcheValues = array ();
23+
2124 // 行为参数定义(默认值) 可在项目配置中覆盖
2225 protected $ options = array (
2326 'URL_ROUTER_ON ' => false , // 是否开启URL路由
@@ -145,10 +148,11 @@ private function parseRule($rule,$route,$regx) {
145148 array_shift ($ paths );
146149 }
147150 }
151+
148152 if (0 === strpos ($ url ,'/ ' ) || 0 ===strpos ($ url ,'http ' )) { // 路由重定向跳转
149153 if (strpos ($ url ,': ' )) { // 传递动态参数
150- $ values = array_values ($ matches );
151- $ url = preg_replace ('/:(\d+)/e ' , ' $values[ \\ 1-1] ' , $ url );
154+ $ this -> matcheValues = array_values ($ matches );
155+ $ url = preg_replace_callback ('/:(\d+)/ ' , array ( $ this , ' parseRuleValue ' ), $ url );
152156 }
153157 header ("Location: $ url " , true ,(is_array ($ route ) && isset ($ route [1 ]))?$ route [1 ]:301 );
154158 exit ;
@@ -164,8 +168,12 @@ private function parseRule($rule,$route,$regx) {
164168 }
165169 $ var = array_merge ($ matches ,$ var );
166170 // 解析剩余的URL参数
167- if ($ paths ) {
168- preg_replace ('@(\w+)\/([^\/]+)@e ' , '$var[strtolower( \'\\1 \')]=strip_tags( \'\\2 \'); ' , implode ('/ ' ,$ paths ));
171+ if (!empty ($ paths )) {
172+ for ($ i =0 , $ count = count ($ paths ); $ i < $ count ; $ i += 2 ) {
173+ if (preg_match (/^\w+$ /, $ paths [$ i ]) && isset ($ paths [$ i + 1 ])){
174+ $ var [strtolower ($ paths [$ i ])] = strip_tags ($ paths [$ i + 1 ]);
175+ }
176+ }
169177 }
170178 // 解析路由自动传入参数
171179 if (is_array ($ route ) && isset ($ route [1 ])) {
@@ -177,6 +185,15 @@ private function parseRule($rule,$route,$regx) {
177185 return true ;
178186 }
179187
188+ /**
189+ * 返回参数,用于preg_replace_callback
190+ * @param array $match preg_replace_callback 匹配结果
191+ * @return string
192+ */
193+ private function parseRuleValue ($ match ){
194+ return $ this ->matcheValues [$ match [1 ] - 1 ];
195+ }
196+
180197 // 解析正则路由
181198 // '路由正则'=>'[分组/模块/操作]?参数1=值1&参数2=值2...'
182199 // '路由正则'=>array('[分组/模块/操作]?参数1=值1&参数2=值2...','额外参数1=值1&额外参数2=值2...')
@@ -187,8 +204,9 @@ private function parseRule($rule,$route,$regx) {
187204 // '/new\/(\d+)/'=>array('/new.php?id=:1&page=:2&status=1','301'), 重定向
188205 private function parseRegex ($ matches ,$ route ,$ regx ) {
189206 // 获取路由地址规则
207+ $ this ->matcheValues = $ matches ;
190208 $ url = is_array ($ route )?$ route [0 ]:$ route ;
191- $ url = preg_replace ('/:(\d+)/e ' , ' $matches[ \\ 1] ' , $ url );
209+ $ url = preg_replace_callback ('/:(\d+)/ ' , array ( $ this , ' parseRegexValue ' ), $ url );
192210 if (0 === strpos ($ url ,'/ ' ) || 0 ===strpos ($ url ,'http ' )) { // 路由重定向跳转
193211 header ("Location: $ url " , true ,(is_array ($ route ) && isset ($ route [1 ]))?$ route [1 ]:301 );
194212 exit ;
@@ -198,7 +216,12 @@ private function parseRegex($matches,$route,$regx) {
198216 // 解析剩余的URL参数
199217 $ regx = substr_replace ($ regx ,'' ,0 ,strlen ($ matches [0 ]));
200218 if ($ regx ) {
201- preg_replace ('@(\w+)\/([^,\/]+)@e ' , '$var[strtolower( \'\\1 \')]=strip_tags( \'\\2 \'); ' , $ regx );
219+ $ regx = explode ('/ ' , $ regx );
220+ for ($ i =0 , $ count = count ($ regx ); $ i < $ count ; $ i += 2 ) {
221+ if (preg_match (/^\w+$ /, $ regx [$ i ]) && isset ($ regx [$ i + 1 ])){
222+ $ var [strtolower ($ regx [$ i ])] = strip_tags ($ regx [$ i + 1 ]);
223+ }
224+ }
202225 }
203226 // 解析路由自动传入参数
204227 if (is_array ($ route ) && isset ($ route [1 ])) {
@@ -209,4 +232,13 @@ private function parseRegex($matches,$route,$regx) {
209232 }
210233 return true ;
211234 }
212- }
235+
236+ /**
237+ * 返回参数,用于preg_replace_callback
238+ * @param array $match preg_replace_callback 匹配结果
239+ * @return string
240+ */
241+ private function parseRegexValue ($ match ){
242+ return $ this ->matcheValues [$ match [1 ]];
243+ }
244+ }
0 commit comments