Qufors
@Qufors
Разработчик

Как получить $_get запрос через слеш?

Всем привет. Подскажите пожалуйста такую вещь .. Хочу написать пагинатор для новостей, но не хочу делать ссылки вида:
https://domain.com/news/?p=2

Хочется сделать такого вида:
https://domain.com/news/page/2

Игрался и с preg_match .. ничего не помогает. Для примера как сейчас.

private $page;
// ----------
$this->page = isset($_GET['p']) ? (int)$_GET['p'] : 1; (в __construct)
// ----------
private function mcs_pagination_path($p, $anchor){
        static $url;
        if(empty($url)){
            $url = parse_url($_SERVER['REQUEST_URI']);
            if(!key_exists('query', $url)) $url['query'] = '';
        }
        parse_str($url['query'], $get); unset($get['p']);
        if($p > 1) $get['p'] = $p;
        return sizeof($get) ? sprintf('%s/%s%s', rtrim($url['path'], '/'), vars2url($get), $anchor) : sprintf('%s%s', $url['path'], $anchor);
}

// --- И такое решение

function vars2url($array, $parent = ''){
    $params = array();
    foreach($array as $k => $v){
        if(is_array($v))
            $params[] = vars2url($v, (empty($parent) ? urlencode($k) : $parent . '[' . urlencode($k) . ']'));
        else
            $params[] = (!empty($parent) ? $parent . '[' . urlencode($k) . ']' : urlencode($k)) . '=' . urlencode($v);
    }
    $sessid = session_id();
    if(!empty($parent) || empty($sessid)) return implode('&', $params);
    $sessname = session_name();
    if(ini_get('session.use_cookies')){
        if (!ini_get('session.use_only_cookies') && (!isset($_COOKIE[$sessname]) || ($_COOKIE[$sessname] != $sessid)))
            $params[] = $sessname . '=' . urlencode($sessid);
    } elseif(!ini_get('session.use_only_cookies')){
        $params[] = $sessname . '=' . urlencode($sessid);
    }
    return implode('&', $params);
}


Сейчас это выглядит:
https://domain.com/news/?p=2
  • Вопрос задан
  • 74 просмотра
Решения вопроса 2
DevMan
@DevMan Куратор тега PHP
эмм... зачем?
ведь достаточно просто переделать код на разбор пути, чем возиться с _GET.

но если очень хочется, то типа такого
preg_match('/page\/(?P<page>\d+)$/', $url, $m);
$_GET['p'] = $m['page'];
https://ideone.com/35jrX1
Ответ написан
GennadyS
@GennadyS
Программист, философ
В частном случае это действительно выбирается простым регулярным выражением:
$matches = null;
$page = 1;
if ( preg_match('#^/news/page/(\d+)$#', $_SERVER['PATH_INFO'], $matches) ) $page = (int) $matches[1];

Но лучше воспользоваться готовым роутером:
https://packagist.org/packages/nikic/fast-route
https://packagist.org/packages/league/route
https://packagist.org/packages/aura/router
И т.д.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы