Удаление 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.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 5 ):
malina95 07.11.2013 00:35:35
Зачем такие сложности с разделением ссылки на 2 части? Есть же pparse_url
rysich 24.03.2014 22:17:51
А ещё есть $_SERVER[‘QUERY_STRING’]. Ну, это если сокращаемый URL и URL текущей страницы совпадают.
(Алекс) 04.10.2015 15:58:32
А еще есть strTok(), которая «отсекает» все вместе переданным токеном.
Great 15.11.2013 18:07:36
indigo 06.07.2021 21:36:01
Чуток переделанная функция которая принимает удаляет нужные ключи 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-2024 Русаков Михаил Юрьевич. Все права защищены.
Удаление параметра из строки GET по регулярному выражению
Помогите с правильным составлением регулярного выражения для preg_replace , точнее мне нужно удалить из строки какой либо параметр GET К примеру, строка cbook.php?idc=n&ids=n&p=2&q=44 из которой мне надо удалить параметр p вне зависимости в какой позиции он стоит, возможно это ?p=2 или же &p=2 . Для этого использую такое регулярное выражение:
$s = preg_replace('//', '','cbook.php?idc=n&ids=n&p=2&q=44');
Но нормальных результатов оно не дает, что я не правильно составил тут? (делал по учебнику)
Отслеживать
27.2k 2 2 золотых знака 45 45 серебряных знаков 76 76 бронзовых знаков
задан 15 ноя 2017 в 10:20
734 5 5 золотых знаков 31 31 серебряный знак 58 58 бронзовых знаков
по какому учебнику, если не секрет? )
15 ноя 2017 в 10:37
@Jean-Claude А в cbook.php?p=2 знак вопроса надо удалить. У меня получилось что-то вроде (?:&|(?(?=\?[^&]*&)(\?)|\?))p=\d+(?(1)&?) (заменить на ‘$1’ ).
15 ноя 2017 в 10:46
15 ноя 2017 в 11:09
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Без регулярных выражений:
list($path, $query) = explode('?', 'cbook.php?idc=n&ids=n&p=2&q=44'); parse_str($query, $q); // $q - массив параметров unset($q['p']); $query = http_build_query($q); $url = "?$query"; echo $url; // cbook.php?idc=n&ids=n&q=44
Отслеживать
ответ дан 15 ноя 2017 в 10:59
27.2k 2 2 золотых знака 45 45 серебряных знаков 76 76 бронзовых знаков
хах, в этот раз я не успел написать 😀
15 ноя 2017 в 10:59
прям почти слово в слово, мысль была еще учесть # только (:
15 ноя 2017 в 11:00
Ну так, функции стандартные)
15 ноя 2017 в 11:01
@vp_arth спасибо! но у меня почему то конструкция в первой строке с квадратными скобками вызывает ошибку( Parse error: syntax error, unexpected ‘[‘ in Z:\home\rrr\www\r.php on line 2
15 ноя 2017 в 11:04
Это для php7, сейчас уберу
15 ноя 2017 в 11:04
Бутор — эти регулярки, проще всего так
$http = parse_url('/cbook.php?idc=n&ids=n&p=2&q=44'); parse_str($http['query'], $output); if(isset($output['p'])) < unset($output['p']); >$new = $http["path"] . '?' . http_build_query($output); echo $new;
Отслеживать
ответ дан 15 ноя 2017 в 11:02
Jean-Claude Jean-Claude
5,840 2 2 золотых знака 19 19 серебряных знаков 45 45 бронзовых знаков
В вопросе неполный url)
15 ноя 2017 в 11:03
@vp_arth ну ок, уговорил.
15 ноя 2017 в 11:05
Для корректного удаления подстроки понадобится шаблон, состоящий из трёх альтернатив:
Если удаляемый элемент находится сразу после вопросительного знака, но не является единственным GET-параметром
(в этом случае надо оставить знак «?», и удалить знак «&» вместе с удаляемым элементом)
Если удаляемый элемент находится сразу после вопросительного знака, и является единственным GET-параметром
(в этом случае надо удалить знак «?», и все остальные символы после него)
Если удаляемый элемент находится в любой другой позиции подстроки
(в этом случае, вместе с удаляемыми символами надо удалять и знак «&», предшествующий удаляемой подстроке)
Шаблон будет иметь следующий вид:
В комплекте с PHP-функцией он будет выглядеть таким образом:
Тестировался на следующих строках:
cbook.php?idc=n&ids=n&crop=4&p=2&q=44
cbook.php?idc=n&ids=n&p=2&q=44
cbook.php?p=2&idc=n&ids=n
cbook.php?idc=n&p=2
cbook.php?p=2
reset
reset() перемещает внутренний указатель массива array к его первому элементу и возвращает значение первого элемента массива.
Список параметров
Возвращаемые значения
Возвращает значение первого элемента массива, или false , если массив пуст.
Внимание
Эта функция может возвращать как логическое значение false , так и значение не типа boolean, которое приводится к false . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Список изменений
| Версия | Описание |
|---|---|
| 8.1.0 | Вызов функции в объекте ( object ) объявлен устаревшим. Либо сначала преобразуйте объект ( object ) в массив ( array ) с помощью функции get_mangled_object_vars() , либо используйте методы, предоставляемые классом, реализующим интерфейс Iterator , например, ArrayIterator . |
| 7.4.0 | Экземпляры классов SPL теперь обрабатываются как пустые объекты, не имеющие свойств, вместо вызова метода Iterator с тем же именем, что и эта функция. |
Примеры
Пример #1 Пример использования reset()
$array = array( ‘первый шаг’ , ‘второй шаг’ , ‘третий шаг’ , ‘четвёртый шаг’ );
// по умолчанию указатель указывает на первый элемент
echo current ( $array ) . «
\n» ; // «первый шаг»
// пропускаем два шага
next ( $array );
next ( $array );
echo current ( $array ) . «
\n» ; // «третий шаг»
// сбрасываем указатель, тем самым возвращаемся к первому шагу
reset ( $array );
echo current ( $array ) . «
\n» ; // «первый шаг»
Примечания
Замечание: Результат использования на пустом массиве будет неотличим от использования массива, первый элемент которого имеет тип bool со значением false . Чтобы правильно проверить значение первого элемента, который может содержать false , можно использовать функцию count() или проверить значение key() , что оно не равно null , после вызова reset() .
Смотрите также
- current() — Возвращает текущий элемент массива
- each() — Возвращает текущую пару ключ/значение из массива и смещает его указатель
- end() — Устанавливает внутренний указатель массива на его последний элемент
- next() — Перемещает указатель массива вперёд на один элемент
- prev() — Передвигает внутренний указатель массива на одну позицию назад
- array_key_first() — Получает первый ключ массива
User Contributed Notes 13 notes
11 years ago
GOTCHA: If your first element is false, you don’t know whether it was empty or not.
$a = array();
$b = array( false , true , true );
var_dump ( reset ( $a ) === reset ( $b )); //bool(true)
?>
So don’t count on a false return being an empty array.
7 years ago
As for taking first key of an array, it’s much more efficient to RESET and then KEY, rather then RESET result of ARRAY_KEYS (as sugested by gardnerjohng at gmail dot com).
reset ( $someArray );
echo key ( $someArray );
?>
This will give the same result but is much much faster. Larger arrays, better performance. Tested on 100-elements long array with 16 times faster results.
18 years ago
Also it’s good to reset this way the multidimentional arrays:
reset($voo2[‘moder’]);
while (list($key, $value) = each ($voo2[‘moder’]))
reset($voo2[‘moder’][$key]);
while (list($key1, $value1) = each ($voo2[‘moder’][$key])) #do what u want
>
10 years ago
Note that you can’t use pointer here. It will reset the iteration counter in this case.
foreach($array as $key=>&$value)
Use standard foreach instead
foreach($array as $key=>$value)
19 years ago
Note that reset() will not affect sub-arrays of multidimensional array.
$arr = array(
1 => array( 2 , 3 , 4 , 5 , 6 ),
2 => array( 6 , 7 , 8 , 9 , 10 )
);
while(list( $i ,) = each ( $arr ))
echo «IN \$arr[ $i ]
» ;
while(list( $sub_i , $entry ) = each ( $arr [ $i ]))
echo «\$arr[ $i ][ $sub_i ] = $entry
» ;
>
>
// Do the same again
while(list( $i ,) = each ( $arr ))
echo «IN \$arr[ $i ]
» ;
while(list( $sub_i , $entry ) = each ( $arr [ $i ]))
echo «\$arr[ $i ][ $sub_i ] = $entry
» ;
>
>
?>
will print
8 years ago
In response to gardnerjohng’s note to retrieve the first _key_ of an array:
To retrieve the first _key_ of an array you can use the combination of reset() and key().
$properties = array(
‘colour’ => ‘grey’ ,
‘flavour’ => ‘rubber’ ,
‘name’ => ‘Mouse Ball’ ,
‘texture’ => ‘rubbery’
);
reset ( $properties );
echo key ( $properties ); // => ‘colour’
?>
I prefer this solution as you don’t have to create the keys array. This should (not measured) improve performance on large arrays.
8 years ago
Following code gives a strict warning in 5.4.45
«Strict warning: Only variables should be passed by reference»
$keys = array_keys($result[‘node’]);
return reset($keys);
2 years ago
Since reset() returns the first «value» of the array beside resetting its internal pointer; it will return different results when it is combined with key() or used separately. Like;
$products = array(
‘biscuits’ => array( ‘biscuit1’ => ‘cobis’ , ‘biscuit2’ => ‘probis’ ),
‘chocolates’ => array( ‘coco1’ => ‘cococ’ , ‘coco2’ => ‘prococ’ ),
);
echo key ( reset ( $products [ ‘biscuits’ ])); // Fatal error
reset ( $products [ ‘biscuits’ ]);
echo key ( $products [ ‘biscuits’ ]); // Will print ‘biscuit1’
?>
This is perfectly normal because in the first method, reset() returned the first «value» of the ‘biscuits’ element which is to be «cbosi». So key(string) will cause a fatal error. While in the second method you just reset the array and didn’t use a returning value; instead you reset the pointer and than extracted the first key of an array.
If your array has more dimensions, it won’t probably cause a fatal error but you will get different results when you combine reset() and key() or use them consecutively.
17 years ago
Colin, there`s a better (IMO) way to solve your problem.
// .
foreach($a as $k => &$d)<> // notice the «&»
// .
?>
It`s a new feature in PHP5 to use references in foreach loop. This way PHP isn`t making a copy of the array, so the internal pointer won`t be reset.
13 years ago
Don’t use `reset()` to get the first value of an associative array. It works great for true arrays but works unexpectedly on Iterator objects. http://bugs.php.net/bug.php?id=38478
17 years ago
I had a problem with PHP 5.0.5 somehow resetting a sub-array of an array with no apparent reason. The problem was in doing a foreach() on the parent array PHP was making a copy of the subarrays and in doing so it was resetting the internal pointers of the original array.
The following code demonstrates the resetting of a subarray:
// Set the pointer of $a to ‘b’ and the pointer of ‘b’ to ‘CC’
reset($a);
next($a);
next($a[‘b’]);
next($a[‘b’]);
next($a[‘b’]);
The result of the two var dumps are 3 and 0, respectively. Clearly the internal pointer of $a[‘b’] was reset by doing the foreach loop over $a.
Each time the foreach loop iterated over the ‘a’ and ‘b’ keys of $a it made a copy of $a[‘a’] and $a[‘b’] into $d which resetted the internal pointers of $a[‘a’] and $a[‘b’] despite making no obvious changes.
The solution is instead to iterate over the keys of $a.
and using $a[$k] (or creating an alias of $a[$k] as $d and dealing with the consequences of using aliases).
For the curious, I was implementing the Iterator interface on a dummy object and calling a global object to do the actual iteration (also to cope with PHP’s lack of C-style pointers which when doing a $a = $b on objects would cause the data in $a to be inconsistent with the data in $b when modified). Being that I had many dummy objects representing different data sets I chose to store each data set as a subarray contained within the global object. To make this work each dummy object has to store a key (which can freely be duplicated without problems) that it passes to the global object when rewind, key, current, next, and valid were called on the dummy object.
Unfortunately for me, my key required to be more than just a simple string or number (if it was then it could be used to directly index the subarray of data for that object and problem avoided) but was an array of strings. Instead, I had to iterate over (with a foreach loop) each subarray and compare the key to a variable stored within the subarray.
So by using a foreach loop in this manner and with PHP resetting the pointer of subarrays it ended up causing an infinite loop.
Really, this could be solved by PHP maintaining internal pointers on arrays even after copying.
9 years ago
If you need an easy way to retrieve the first *key* in an array (instead of the value), it can be done like this:
$properties = array(
‘colour’ => ‘grey’ ,
‘flavour’ => ‘rubber’ ,
‘name’ => ‘Mouse Ball’ ,
‘texture’ => ‘rubbery’
);
# Will output «colour».
echo reset ( array_keys ( $properties ));
?>
Potentially helpful for configuration files that define a sequence of items as an associative array.
17 years ago
I wrote a nice function, which rotates values of array. Very useful for table rows where you have to rotate colors
- Функции для работы с массивами
- array_change_key_case
- array_chunk
- array_column
- array_combine
- array_count_values
- array_diff_assoc
- array_diff_key
- array_diff_uassoc
- array_diff_ukey
- array_diff
- array_fill_keys
- array_fill
- array_filter
- array_flip
- array_intersect_assoc
- array_intersect_key
- array_intersect_uassoc
- array_intersect_ukey
- array_intersect
- array_is_list
- array_key_exists
- array_key_first
- array_key_last
- array_keys
- array_map
- array_merge_recursive
- array_merge
- array_multisort
- array_pad
- array_pop
- array_product
- array_push
- array_rand
- array_reduce
- array_replace_recursive
- array_replace
- array_reverse
- array_search
- array_shift
- array_slice
- array_splice
- array_sum
- array_udiff_assoc
- array_udiff_uassoc
- array_udiff
- array_uintersect_assoc
- array_uintersect_uassoc
- array_uintersect
- array_unique
- array_unshift
- array_values
- array_walk_recursive
- array_walk
- array
- arsort
- asort
- compact
- count
- current
- end
- extract
- in_array
- key_exists
- key
- krsort
- ksort
- list
- natcasesort
- natsort
- next
- pos
- prev
- range
- reset
- rsort
- shuffle
- sizeof
- sort
- uasort
- uksort
- usort
- each
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
remove_query_arg() │ WP 1.5.0
Удаляет указанные параметры GET запроса из URL: ?parametr=value¶m2=val2 .
Работает на основе: add_query_arg()
1 раз — 0.000055 сек (очень быстро) | 50000 раз — 0.19 сек (очень быстро) | PHP 7.1.5, WP 4.8.2
Возвращает
Строку . Новый обработанный URL.
Использование
remove_query_arg( $key, $query );
$key(строка/массив) (обязательный) Параметр или параметры запроса которые нужно удалить из URL. $query(логический) URL, строка которую нужно обработать, из которой нужно удалить указанные в первом параметре параметры запроса. По умолчанию используется текущий запрос: $_SERVER[‘REQUEST_URI’] .
По умолчанию: falseПримеры
#1 Удаление нескольких параметров запроса из УРЛ
Предположим мы передаем параметры запроса: remove_recomend и post_id , обрабатываем их и затем нам нужна ссылка без этих параметров, чтобы использовать её дальше в коде:
// используется $_SERVER['REQUEST_URI'] и переданные параметры запроса // удаляем, теперь уже не нужные, параметры $page_url = remove_query_arg( array( 'remove_recomend', 'post_id' ) ); // Используем очищенную от параметров переменную $page_url echo esc_url( $page_url );
#2 Удалим параметры запроса из указанного URL
$url = 'http://blog.example.com/2009/?hello=world&foo=bar'; echo remove_query_arg( 'hello', $url ); //> http://blog.example.com/2009/?foo=bar
Добавить свой пример
Список изменений
С версии 1.5.0 Введена. Код remove_query_arg() remove query arg WP 6.4.2
function remove_query_arg( $key, $query = false ) < if ( is_array( $key ) ) < // Removing multiple keys. foreach ( $key as $k ) < $query = add_query_arg( $k, false, $query ); >return $query; > return add_query_arg( $key, false, $query ); >
Cвязанные функции
Основной запрос WP
- add_query_arg()
- get_queried_object()
- get_queried_object_id()
- get_query_var()
- get_search_query()
- get_status_header_desc()
- is_embed()
- is_robots()
- redirect_canonical()
- wp()