@SlowJan

Как удалить гет параметр из реферера?

Как удалить элемент из http реферрера ($_SERVER['HTTP_REFERER']) ? а именно если там данные в виде массива
/search?Filter[form]=1&Filter[type]=2
Например удалить Filter[form]=1 и получить /search?Filter[type]=2

Есть такая функция

function deleteGET($url, $name, $amp = true) {
    $url = str_replace("&", "&", $url); // Заменяем сущности на амперсанд, если требуется
    list($url_part, $qs_part) = array_pad(explode("?", $url), 2, ""); // Разбиваем URL на 2 части: до знака ? и после
    parse_str($qs_part, $qs_vars); // Разбиваем строку с запросом на массив с параметрами и их значениями
    unset($qs_vars[$name]); // Удаляем необходимый параметр
    if (count($qs_vars) > 0) { // Если есть параметры
      $url = $url_part."?".http_build_query($qs_vars); // Собираем URL обратно
      if ($amp) $url = str_replace("&", "&", $url); // Заменяем амперсанды обратно на сущности, если требуется
    }
    else $url = $url_part; // Если параметров не осталось, то просто берём всё, что идёт до знака ?
    return $url; // Возвращаем итоговый URL
  }


но с в моем случае name это массив
  • Вопрос задан
  • 320 просмотров
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Вся сложность в том что при использовании parse_str параметры которые являются массивом, преобразуются в массив в РНР
Array
(
    [Filter] => Array
        (
            [form] => 1
            [type] => 2
        )
)


Быстрый хак - можно в исходной строке $qs_part сделать замену параметра на некий уникальный плейсхолдер, который явно в строке не встретится и тогда удалить элемент можно будет через unset() как и хотел автор.

<?php
$url = 'https://example.com/search?Filter[form]=1&Filter[type]=2';
$name = 'Filter[form]';

print_r(deleteGET($url, $name));

//https://example.com/search?Filter%5Btype%5D=2

function deleteGET($url, $name, $amp = true)
{
    // Заменяем сущности на амперсанд, если требуется
    $url = str_replace("&amp;", "&", $url);

    // Разбиваем URL на 2 части: до знака ? и после
    list($url_part, $qs_part) = array_pad(explode("?", $url), 2, "");

    $qs_part = str_replace($name.'=', '{REPLACE_NAME}=', $qs_part);

    // Разбиваем строку с запросом на массив с параметрами и их значениями
    parse_str($qs_part, $qs_vars);

    // Удаляем необходимый параметр
    unset($qs_vars['{REPLACE_NAME}']);

    // Если есть параметры
    if(count($qs_vars) > 0)
    { 
        $url = $url_part."?".http_build_query($qs_vars); // Собираем URL обратно
        if($amp)
        {
            // Заменяем амперсанды обратно на сущности, если требуется
            $url = str_replace("&", "&amp;", $url);
        } 
    }
    else
    {
        // Если параметров не осталось, то просто берём всё, что идёт до знака ?
        $url = $url_part;
    } 

    // Возвращаем итоговый URL
    return $url; // Возвращаем итоговый URL
}
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы