Php убрать get запрос

Remove a parameter and its value from URL’s query string

I’m coding an algorithm to remove a parameter (let’s call it foo ) from URL strings. Of course, after the foo parameter removal, the query string should remain valid (with a leading ? and remaining parameters separated by & ). I’d also like to remove the leading ? if foo was the only parameter.

Details:

  • Domain and pathname should be preserved.
  • The URLs may not contain a query string. Expected output is the same as input.
  • The URLs may contain a query string which does not contain the foo parameter. Expected output is the same as input.
  • The URLs are already properly URL-encoded.
  • Fragments (hashes) don’t necessarily need to be kept, but it would be a nice little extra.
http://example.com/?foo=42 http://example.com/?foo=42&bar=43 http://example.com/?bar=43&foo=42 http://example.com/?bar=43&foo=42&baz=44 http://domain.com.uk/pathname?foo=42&bar=bar%20value http://yahoo.com/mail http://nofoo.com/?bar=43 
http://example.com/ http://example.com/?bar=43 http://example.com/?bar=43 http://example.com/?bar=43&baz=44 http://domain.com.uk/pathname?bar=bar%20value http://yahoo.com/mail http://nofoo.com/?bar=43 

The regex itself is rather simple. The callback logic is as follows:

  • If foo is not the last parameter (2nd capturing group is not end of string), then the whole match is replaced by the first capturing group ( ? or & ). This handles:
    • ?foo=valuefoo&bar -> ?bar
    • &foo=valuefoo&bar -> &bar
    • ?bar=valuebar&foo=valuefoo -> ?bar=valuebar
    • ?foo=valuefoo -> (empty string)

    This logic seemed rather complicated, hence I rewrote it into a single regex:

    Now both logic branches are separated by the regex OR | and the 1st capturing group only occurs in the «foo is not the last parameter» branch.

    I’ve looked at regex conditionals but those would just overcomplicate an otherwise simple regex.

    This seemed like a simple task at first glance, but now I’m wondering whether I should even use Regex for this.

    Right now I’m thinking about substr ‘ing from the first ? , explode ing the query string at & , array_filter based on the parameters names, implode and concatenate it to the URL again, but this looks overly verbose.

    Is there a better approach (mainly in terms of readability and maintainability) to remove a query string parameter?

    New approach using native functions and borrowing some code from PHP docs’ comments:

    //http://www.php.net/manual/en/function.parse-url.php#106731 function unparse_url($parsed_url) < $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : ''; $host = isset($parsed_url['host']) ? $parsed_url['host'] : ''; $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; $user = isset($parsed_url['user']) ? $parsed_url['user'] : ''; $pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : ''; $pass = ($user || $pass) ? "$pass@" : ''; $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; return "$scheme$user$pass$host$port$path$query$fragment"; >function removeQueryParam($url, $param_to_remove) < $parsed = parse_url($url); if ($parsed && isset($parsed['query'])) < $parsed['query'] = implode('&', array_filter(explode('&', $parsed['query']), function($param) use ($param_to_remove) < return explode('=', $param)[0] !== $param_to_remove; >)); if ($parsed['query'] === '') unset($parsed['query']); return unparse_url($parsed); > else < return $url; >> 

    It works fine even with hashes/fragments now. Is there anything else to be improved? As far as I can see, there’s no native method to parse a query string into an array, hence the explode , array_filter and implode method is the more maintainable I could get.

    Источник

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

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

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

    Привожу сразу код функции, которая это делает:

    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. Ведь тут имеется огромное количество нюансов. Просто удалить строку — легко, но ведь нужно, чтобы исчез «?«, если не осталось больше параметров. Нужно, чтобы исчез «&» перед удалённым параметром, но при условии, что он был не первый в строке запроса. Нужно, чтобы удалился & после параметра, но при условии, что он был не последний. Но при этом нельзя удалить сразу и спереди, и сзади амперсанд, иначе пострадают параметры до и после удаляемого. Видите, сколько нюансов, в казалось бы простой задаче? Данная же функция всё это учитывает.

    Вот так можно легко удалить GET-параметр из URL, вызвав функцию из этой статьи.

    Создано 06.11.2013 12:24:14

  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:
    Она выглядит вот так:
  2. Текстовая ссылка:
    Она выглядит вот так: Как создать свой сайт
  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии ( 5 ):

Зачем такие сложности с разделением ссылки на 2 части? Есть же pparse_url

А ещё есть $_SERVER[‘QUERY_STRING’]. Ну, это если сокращаемый URL и URL текущей страницы совпадают.

А еще есть strTok(), которая «отсекает» все вместе переданным токеном.

Чуток переделанная функция которая принимает удаляет нужные ключи function deleteGET($url, $names = []) < $url_part = parse_url($url); //разбиваем адресную строку на массив parse_str($url_part['query'], $get_part); //получаем с адресной строки get параметры (вторая переменаая уже массив "$get_part") //проходимся по массиву находим и удаляем нужные ключи foreach ($names as $v)< unset($get_part[$v]); >//если есть хотя бы 1 get параметр собираем адресную строку и отдем ее if (count($get_part) > 0) < $url = $url_part['path'] . '?' .http_build_query($get_part); >//если get параметров нет просто возарвешь адресную строку без get парамертров else $url = $url_part[‘path’]; return $url; // Возвращаем итоговый URL > echo deleteGET(«http://mysite.ru/?view=category&page=5&id=5», «page»);

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

Источник

Как убрать GET из URL?

php_value session.gc_maxlifetime 8640000
php_value session.cookie_lifetime 8640000
RewriteEngine on
RewriteCond % !-f
RewriteCond % !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
RewriteEngine On
RewriteRule ^5$ $1 [L,QSA]
RewriteCond % ^сайт.ру$ [NC]
RewriteRule ^(.*)$ https://сайт.ру/$1 [R=301,L]
php_value default_charset utf-8
AddType ‘text/html; charset=utf-8’ .html .htm .shtml»

Нужно, чтобы когда я переходил на: сайт.ру/q?example=1 было сайт.ру/q/example/1.
Буду рад помощи!

shambler81

RewriteCond % (^|&)(.+)\=(7)($|&) RewriteRule ^q$ /%2/%3? [L,R=301]

где (^|&). ($|&) — не важная штука
(.+) — любое больше чем 1 буква или цифра
(4) — любые цифры но не менее 1.
^q$ — то что было в урле до GET
%2 — вторая группа из RewriteCond — аналог $2 из RewriteRule
? — удалить гет параметры.

Не знаю, ничего не сработало с htaccess. Сделал немного костыльным способом, убрал GET запрос через JS. Но всёравно благодарен за разъяснение, надеюсь в будущем пригодится

shambler81

php_value upload_max_filesize 30M
php_value post_max_size 30M

php_value session.gc_maxlifetime 8640000
php_value session.cookie_lifetime 8640000
RewriteEngine on
RewriteCond % !-f
RewriteCond % !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
RewriteEngine On

RewriteRule ^5$ $1 [L,QSA]
RewriteCond % ^www.site.ru$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]
php_value default_charset utf-8
AddType ‘text/html; charset=utf-8’ .html .htm .shtml

shambler81

htaccess читается с верху вниз до полного установления урлов.
По этому имеет значение где вы разместили правила.
В вашем случае ЧПУ c сайта срабатывает вначале

RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Поскольку удовлетворяет условию это не файл и не директория.
Короче переместите все ваши редиректы до ЧПУ

php_value session.cookie_lifetime 8640000 php_value default_charset utf-8 AddType 'text/html; charset=utf-8' .html .htm .shtml RewriteEngine On RewriteRule ^5$ $1 [L,QSA]1 [R=301,L] RewriteCond % (^|&)(.+)\=(8)($|&) RewriteRule ^q$ /%2/%3? [L,R=301] RewriteCond % ^www\.site\.ru$ [NC] RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L] RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Источник

удалить параметр GET в URL после завершения обработки (без использования POST), PHP

У меня есть url, как этот http://localhost/join/prog/ex.php Когда я использую метод GET, адрес URL, подобный этому http://localhost/join/prog/ex.php?name=MEMORY+2+GB&price=20&quantity=2&code=1&search=add Мой вопрос: поэтому я все еще использую метод GET, но я хочу, чтобы после обработки в методе GET закончен, я хочу вернуть URL (удалить параметр) в http://localhost/join/prog/ex.php , как ранее (не используя метод POST). Как я могу это сделать?

@pekka: нет перенаправления, но я хочу удалить параметр, когда закончите, используя метод GET (просто удалите параметр)

Кажется, вы путаете цель GET и POST. GET-запросы извлекают статические ресурсы, POST-запросы создают изменение данных на стороне сервера. Я не могу придумать причину, почему вы хотели бы лишить эти параметры.

@Brad: я использую метод GET для сохранения данных в базе данных. каждый раз, когда я обновляю (F5), данные продолжают поступать в базу данных, потому что параметры все еще там. Итак, я хочу, чтобы каждый раз после ввода параметров данные должны были быть стерты, так что каждый раз, когда я обновляю (F5), данные не будут вводиться в базу данных, потому что в URL нет параметра

Именно так. По этой причине вы должны использовать POST или PUT для этого запроса; GET не должен использоваться для создания новых данных.

Бред, иногда у людей есть потребности, которые ты не понимаешь (и это не твое дело). Мой сайт использует только одну страницу, которая динамически обрабатывается с помощью ajax. Моя веб-страница по сути никогда не обновляется. Теперь мне нужно отправить электронное письмо, которое будет содержать ссылку, при нажатии на которую, вы перейдете непосредственно к подразделу сайта и загрузите объект. Из электронной почты я не могу использовать JavaScript. Поэтому я не могу отправить сообщение на мою страницу. Это означает, что я должен отправить GET. Но так как страница никогда не обновляется, параметры GET остаются в адресе навсегда и вызывают проблемы при нажатии F5.

Суть в следующем: когда мы задаем вопросы, нам нужны ответы. Не мнения. То, что он пытается сделать, не имеет смысла в ВАШИХ проектах, не означает, что это не имеет смысла в ИХ проектах. Вы также можете утверждать, что мой проект плохой, что у меня должны быть отдельные страницы, а не одна обновленная страница Ajax . Но опять же, вы будете говорить о вещах, которые вы не знаете. Я не начал этот проект, и я не решил использовать такую структуру. Я взял этот проект от других людей, и теперь я застрял с ним. Так пожалуйста. Дайте ответы, а не мнения. Спасибо.

Источник

Читайте также:  Combobox tkinter python get
Оцените статью