Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php; remove single variable value pair from querystring

Tags:

php

I have a page that lists out items according to numerous parameters ie variables with values.

listitems.php?color=green&size=small&cat=pants&pagenum=1 etc.

To enable editing of the list, I have a parameter edit=1 which is appended to the above querystring to give:

listitems.php?color=green&size=small&cat=pants&pagenum=1&edit=1

So far so good.

WHen the user is done editing, I have a link that exits edit mode. I want this link to specify the whole querystring--whatever it may be as this is subject to user choices--except remove the edit=1.

When I had only a few variables, I just listed them out manually in the link but now that there are more, I would like to be able programmatically to just remove the edit=1.

Should I do some sort of a search for edit=1 and then just replace it with nothing?

$qs = str_replace("&edit=1, "", $_SERVER['QUERY_STRING']);
<a href='{$_SERVER['PHP_SELF']}?{$qs}'>return</a>;

Or what would be the cleanest most error-free way to do this.

Note: I have a similar situation when going from page to page where I'd like to take out the pagenum and replace it with a different one. There, since the pagenum varies, I cannot just search for pagenum=1 but would have to search for pagenum =$pagenum if that makes any difference.

Thanks.

like image 959
user1904273 Avatar asked Jun 15 '13 10:06

user1904273


3 Answers

I'd use http_build_query, which nicely accepts an array of parameters and formats it correctly. You'd be able to unset the edit parameter from $_GET and push the rest of it into this function.

Note that your code has a missing call to htmlspecialchars(). A URL can contain characters that are active in HTML. So when outputting it into a link: Escape!

Some example:

unset($_GET['edit']); // delete edit parameter;
$_GET['pagenum'] = 5; // change page number
$qs = http_build_query($_GET);

... output link here.
like image 178
Sven Avatar answered Oct 16 '22 14:10

Sven


Here's my shot:

/**
*   Receives a URL string and a query string to remove. Returns URL without the query string
*/
function remove_url_query($url, $key) {
    $url = preg_replace('/(?:&|(\?))' . $key . '=[^&]*(?(1)&|)?/i', "$1", $url);
    $url = rtrim($url, '?');
    $url = rtrim($url, '&');
    return $url;
}

Returns:

remove_url_query('http://example.com?a', 'a') => http://example.com
remove_url_query('http://example.com?a=1', 'a') => http:/example.com
remove_url_query('http://example.com?a=1&b=2', 'a') => http://example.com?b=2

Kudos to David Walsh.

like image 39
Lucas Bustamante Avatar answered Oct 16 '22 14:10

Lucas Bustamante


Another solution, to avoid &amp; problems too!!!

remove_query('http://example.com/?a=valueWith**&amp;**inside&b=value');

Code:

function remove_query($url, $which_argument=false){ 
    return preg_replace('/'. ($which_argument ? '(\&|)'.$which_argument.'(\=(.*?)((?=&(?!amp\;))|$)|(.*?)\b)' : '(\?.*)').'/i' , '', $url);  
}
like image 3
T.Todua Avatar answered Oct 16 '22 15:10

T.Todua