Удаление GET-параметра из URL

07.08.19 19:06:04 08.08.19 21:14:20 102

*Источник: //myrusakov.ru/php-delete-get.html

Где это может быть нужно? Допустим, Вы делаете навигацию по страницам. И Вам необходимо сделать универсальный скрипт её создания, добавляя к текущему URL параметр page. Однако, текущий URL может быть уже с параметром page. В итоге, получится, например, такой URL: "/?page=5&page=7". Тогда как правильный должен быть: "/?page=7". Таким образом, необходимо сначала удалить параметр page, а уже потом скрипт создания навигации по страницам сделает своё дело.

<?php 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 } echo deleteGET("http://mysite.ru/?view=category&page=5&id=5", "page"); ?>

Не очень сложный скрипт, однако, он выполняет весьма сложную задачу – удаление GET-параметра из URL. Ведь тут имеется огромное количество нюансов. Просто удалить строку – легко, но ведь нужно, чтобы исчез “?”, если не осталось больше параметров. Нужно, чтобы исчез “&” перед удалённым параметром, но при условии, что он был не первый в строке запроса. Нужно, чтобы удалился & после параметра, но при условии, что он был не последний. Но при этом нельзя удалить сразу и спереди, и сзади амперсанд, иначе пострадают параметры до и после удаляемого. Видите, сколько нюансов, в казалось бы простой задаче? Данная же функция всё это учитывает.