user1904273
user1904273

Reputation: 4764

php; remove single variable value pair from querystring

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.

Upvotes: 12

Views: 18374

Answers (4)

Lucas Bustamante
Lucas Bustamante

Reputation: 17287

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.

Upvotes: 9

T.Todua
T.Todua

Reputation: 56557

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);  
}

Upvotes: 3

GuyB7
GuyB7

Reputation: 606

It wouldn't work if edit=1 is the first variable:

listitems.php?edit=1&color=green&...

You can use the $_GET variable to create the query string yourself. Something like:

$qs = '';
foreach ($_GET as $key => $value){
    if ($key  == 'pagenum'){
        // Replace page number
        $qs .= $key  . '=' . $new_page_num . '&';
    }elseif ($key  != 'edit'){
        // Keep all key/values, except 'edit'
        $qs .= $key  . '=' . urlencode($value) . '&';
    }
}

Upvotes: 1

Sven
Sven

Reputation: 70933

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.

Upvotes: 26

Related Questions