简体   繁体   中英

replace a wildcard for url comparison

I need to check valid routes from a route files where i want to put a wildcard (or placeholder) for url part that is dynamic. The router read all routes in that json format:

{"action" : "BlogController@showPost", "method" : "GET", "url" : "showPost/id/{}"}

I need when the comparsion occurs to change the holder {any} with the current value and maybe allow to put regex expression inside the {any} tag.

An url like this: showPost/id/211 have to be compared with showPost/id/{} and should return true. If possible i would like to allow putting {'[0-9]\\'} as optional param to ensure that the real value match a regex expression.

What best solution to do this?

The comparsison method is this:

    public static function findAction($query) {
       foreach (Router::getInstance()->routes as $route) {
         if ($route->url == $query) {
             return $route;
         }
     }
}

The $query contains /showPost/id/221 and the Router::getInstance()->routes->route->url contains showPost/id/{}

The post is related to this auto-solved question: how to make nice rewrited urls from a router I don't re-post router code in order to avoid duplication.

Thanks in advance

I found a solution using "?" as a wildcard for routes json file. Its not maybe the best way but actually works. The method now replace (and try to check) the real path queries with ? and check the routes each cycle.

public static function findAction($query) {
        //d($query);
        $queryArray = explode("/", $query);
        //d($queryArray);
           foreach (Router::getInstance()->routes as $route) {
             if ($route->url == $query) {
                 // replace current routes url with incoming url
                 $route->url = $query;
                 return $route;
             } else {
                 $queryReplace = null;
                 foreach ($queryArray as $key => $value) {
                     if (strpos($route->url,"?")) {
                         $queryReplace = str_replace("?", $value, $route->url);
                         if($queryReplace == $query) {
                             $route->url = $query;
                             return $route;
                         }
                     }
                 }

             }

I still would like to put {any or regex} but atm i did not found a solution to this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM