Обратный путь от регулярного выражения

0

Вы знаете, что обратная маршрутизация известна. Я использую CodeIgniter и пытаюсь создать URL-адрес из маршрутов регулярных выражений.

Мой образец маршрута:

$route['product-detail/([a-z]+)/(\d+)'] = "catalog/product_view/$2";

или:

$route['product-detail/([a-z]+)/(\d+)'] = array('catalog/product_view/$2', 'product-detail');

Использование образца:

<a href="<?php echo route('product-detail' , array('category' => 'bikes', 'id' => 9)); ?>">Item Name</a>

Ожидаемый результат:

<a href="/product-detail/bikes/9">Item Name</a>

Я попробовал Easy Reverse Routing, но он поддерживает только ключи, а не строки регулярных выражений.

Как я могу достичь этой проблемы?

Теги:
codeigniter
routing
url-routing

1 ответ

1
Лучший ответ

Попробуйте это исправление для метода reverseRoute. Измените это:

$route = $this->_reverseRoutes[$route_name];

foreach($args_keyval as $key => $val)
{
    $route = str_replace("(:$key)", $val, $route);
}

return $route;

к этому: demo

$route = $this->_reverseRoutes[$route_name];

preg_match_all('/\(([^)]+)\)/', $route, $matches);

if (isset($matches[1]) && is_array($matches[1])) {
    $wildCardsAndRegex = $matches[1];
    $index = 0;

    foreach ($args_keyval as $key => $val)
    {
        if (isset($wildCardsAndRegex[$index])) {
            if ($wildCardsAndRegex[$index][0] === ':') {
                // for wildcard
                $route = str_replace('(:'.$key.')', $val, $route);
            } elseif (preg_match('/'.$wildCardsAndRegex[$index].'/', $val)) {
                // for regex
                $route = preg_replace('/\('.preg_quote($wildCardsAndRegex[$index], '\\').'\)/', $val, $route, 1);
            }
        }
        $index++;
    }
}

return $route;
  • 0
    Отличный ответ! Огромное спасибо.
  • 0
    Я сложил о необязательном регулярном выражении. $route['products(/[az]+)?'] = array('products$1', 'products'); Как я могу передать необязательный параметр? Если param существует, URL должен быть products/bikes , если param не существует, URL должен быть похож на только products .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню