Strip off URL parameter with PHP

Php

Php Problem Overview


I have some links in a powerpoint presentation, and for some reason, when those links get clicked, it adds a return parameter to the URL. Well, that return parameter is causing my Joomla site's MVC pattern to get bungled.

So, what's an efficient way to strip off this return parameter using PHP...?

Example: http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0

Php Solutions


Solution 1 - Php

The safest "correct" method would be:

  1. Parse the url into an array with parse_url()
  2. Extract the query portion, decompose that into an array using parse_str()
  3. Delete the query parameters you want by unset() them from the array
  4. Rebuild the original url using http_build_query()

Quick and dirty is to use a string search/replace and/or regex to kill off the value.

Solution 2 - Php

In a different thread Justin suggests that the fastest way is to use strtok()

 $url = strtok($url, '?');

See his full answer with speed tests as well here: https://stackoverflow.com/a/1251650/452515

Solution 3 - Php

This is to complement Marc B's answer with an example, while it may look quite long, it's a safe way to remove a parameter. In this example we remove page_number

<?php
$x = 'http://url.com/search/?location=london&page_number=1';

$parsed = parse_url($x);
$query = $parsed['query'];

parse_str($query, $params);

unset($params['page_number']);
$string = http_build_query($params);
var_dump($string);

Solution 4 - Php

parse_str($queryString, $vars);
unset($vars['return']);
$queryString = http_build_query($vars);

parse_str parses a query string, http_build_query creates a query string.

Solution 5 - Php

function removeParam($url, $param) {
    $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*$/', '', $url);
    $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*&/', '$1', $url);
    return $url;
}

Solution 6 - Php

Procedural Implementation of Marc B's Answer after refining Sergey Telshevsky's Answer.

function strip_param_from_url( $url, $param )
{
	$base_url = strtok($url, '?');				// Get the base url
	$parsed_url = parse_url($url); 				// Parse it 
	$query = $parsed_url['query'];				// Get the query string
	parse_str( $query, $parameters ); 			// Convert Parameters into array
	unset( $parameters[$param] );				// Delete the one you want
	$new_query = http_build_query($parameters); // Rebuilt query string
	return $base_url.'?'.$new_query; 			// Finally url is ready
}

// Usage
echo strip_param_from_url( 'http://url.com/search/?location=london&page_number=1', 'location' )

Solution 7 - Php

You could do a preg_replace like:

$new_url = preg_replace('/&?return=[^&]*/', '', $old_url);

Solution 8 - Php

Here is the actual code for what's described above as the "the safest 'correct' method"...

function reduce_query($uri = '') {
    $kill_params = array('gclid');

    $uri_array = parse_url($uri);
    if (isset($uri_array['query'])) {
        // Do the chopping.
        $params = array();
        foreach (explode('&', $uri_array['query']) as $param) {
          $item = explode('=', $param);
          if (!in_array($item[0], $kill_params)) {
            $params[$item[0]] = isset($item[1]) ? $item[1] : '';
          }
        }
        // Sort the parameter array to maximize cache hits.
        ksort($params);
        // Build new URL (no hosts, domains, or fragments involved).
        $new_uri = '';
        if ($uri_array['path']) {
          $new_uri = $uri_array['path'];
        }
        if (count($params) > 0) {
          // Wish there was a more elegant option.
          $new_uri .= '?' . urldecode(http_build_query($params));
        }
        return $new_uri;
    }
    return $uri;
}

$_SERVER['REQUEST_URI'] = reduce_query($_SERVER['REQUEST_URI']);

However, since this will likely exist prior to the bootstrap of your application, you should probably put it into an anonymous function. Like this...

call_user_func(function($uri) {
    $kill_params = array('gclid');

    $uri_array = parse_url($uri);
    if (isset($uri_array['query'])) {
        // Do the chopping.
        $params = array();
        foreach (explode('&', $uri_array['query']) as $param) {
          $item = explode('=', $param);
          if (!in_array($item[0], $kill_params)) {
            $params[$item[0]] = isset($item[1]) ? $item[1] : '';
          }
        }
        // Sort the parameter array to maximize cache hits.
        ksort($params);
        // Build new URL (no hosts, domains, or fragments involved).
        $new_uri = '';
        if ($uri_array['path']) {
          $new_uri = $uri_array['path'];
        }
        if (count($params) > 0) {
          // Wish there was a more elegant option.
          $new_uri .= '?' . urldecode(http_build_query($params));
        }
        // Update server variable.
        $_SERVER['REQUEST_URI'] = $new_uri;

    }
}, $_SERVER['REQUEST_URI']);

NOTE: Updated with urldecode() to avoid double encoding via http_build_query() function. NOTE: Updated with ksort() to allow params with no value without an error.

Solution 9 - Php

This one of many ways, not tested, but should work.

$link = 'http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0';
$linkParts = explode('&return=', $link);
$link = $linkParts[0];

Solution 10 - Php

Wow, there are a lot of examples here. I am providing one that does some error handling. It rebuilds and returns the entire URL with the query-string-param-to-be-removed, removed. It also provides a bonus function that builds the current URL on the fly. Tested, works!

Credit to Mark B for the steps. This is a complete solution to tpow's "strip off this return parameter" original question -- might be handy for beginners, trying to avoid PHP gotchas. :-)

<?php

function currenturl_without_queryparam( $queryparamkey ) {
	$current_url = current_url();
	$parsed_url = parse_url( $current_url );
	if( array_key_exists( 'query', $parsed_url )) {
		$query_portion = $parsed_url['query'];
	} else {
		return $current_url;
	}

	parse_str( $query_portion, $query_array );

	if( array_key_exists( $queryparamkey , $query_array ) ) {
		unset( $query_array[$queryparamkey] );
		$q = ( count( $query_array ) === 0 ) ? '' : '?';
		return $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'] . $q . http_build_query( $query_array );
	} else {
		return $current_url;
	}
}

function current_url() {
	$current_url = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
	return $current_url;
}

echo currenturl_without_queryparam( 'key' );

?>

Solution 11 - Php

$var = preg_replace( "/return=[^&]+/", "", $var );
$var = preg_replace( "/&{2,}/", "&", $var );

Second line will just replace && to &

Solution 12 - Php

very simple

$link = "http://example.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0"
echo substr($link, 0, strpos($link, "return") - 1);
//output : http://example.com/index.php?id=115&Itemid=283

Solution 13 - Php

@MarcB mentioned that it is dirty to use regex to remove an url parameter. And yes it is, because it's not as easy as it looks:

$urls = array(
  'example.com/?foo=bar',
  'example.com/?bar=foo&foo=bar',
  'example.com/?foo=bar&bar=foo',
);

echo 'Original' . PHP_EOL;
foreach ($urls as $url) {
  echo $url . PHP_EOL;
}

echo PHP_EOL . '@AaronHathaway' . PHP_EOL;
foreach ($urls as $url) {
  echo preg_replace('#&?foo=[^&]*#', null, $url) . PHP_EOL;
}

echo PHP_EOL . '@SergeS' . PHP_EOL;
foreach ($urls as $url) {
  echo preg_replace( "/&{2,}/", "&", preg_replace( "/foo=[^&]+/", "", $url)) . PHP_EOL;
}

echo PHP_EOL . '@Justin' . PHP_EOL;
foreach ($urls as $url) {
  echo preg_replace('/([?&])foo=[^&]+(&|$)/', '$1', $url) . PHP_EOL;
}

echo PHP_EOL . '@kraftb' . PHP_EOL;
foreach ($urls as $url) {
  echo preg_replace('/(&|\?)foo=[^&]*&/', '$1', preg_replace('/(&|\?)foo=[^&]*$/', '', $url)) . PHP_EOL;
}

echo PHP_EOL . 'My version' . PHP_EOL;
foreach ($urls as $url) {
  echo str_replace('/&', '/?', preg_replace('#[&?]foo=[^&]*#', null, $url)) . PHP_EOL;
}

returns:

Original
example.com/?foo=bar
example.com/?bar=foo&foo=bar
example.com/?foo=bar&bar=foo

@AaronHathaway example.com/? example.com/?bar=foo example.com/?&bar=foo

@SergeS example.com/? example.com/?bar=foo& example.com/?&bar=foo

@Justin example.com/? example.com/?bar=foo& example.com/?bar=foo

@kraftb example.com/ example.com/?bar=foo example.com/?bar=foo

My version example.com/ example.com/?bar=foo example.com/?bar=foo

As you can see only @kraftb posted a correct answer using regex and my version is a little bit smaller.

Solution 14 - Php

Remove Get Parameters From Current Page

<?php
$url_dir=$_SERVER['REQUEST_URI']; 

$url_dir_no_get_param= explode("?",$url_dir)[0];

echo $_SERVER['HTTP_HOST'].$url_dir_no_get_param;

Solution 15 - Php

This should do it:

public function removeQueryParam(string $url, string $param): string
{
    $parsedUrl = parse_url($url);

    if (isset($parsedUrl[$param])) {
        $baseUrl = strtok($url, '?');
        parse_str(parse_url($url)['query'], $query);
        unset($query[$param]);
        return sprintf('%s?%s',
            $baseUrl,
            http_build_query($query)
        );
    }

    return $url;
}

Solution 16 - Php

Simple solution that will work for every url

With this solution $url format or parameter position doesn't matter, as an example I added another parameter and anchor at the end of $url:

https://example.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0&bonus=test#test2

Here is the simple solution:

$url = 'https://example.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0&bonus=test#test2';

$url_query_stirng = parse_url($url, PHP_URL_QUERY);
parse_str( $url_query_stirng, $url_parsed_query );
unset($url_parsed_query['return']);
$url = str_replace( $url_query_stirng, http_build_query( $url_parsed_query ), $url );

echo $url;

Final result for $url string is:

https://example.com/index.php?id=115&Itemid=283&bonus=test#test2

Solution 17 - Php

Some of the examples posted are so extensive. This is what I use on my projects.

function removeQueryParameter($url, $param){
    list($baseUrl, $urlQuery) = explode('?', $url, 2);
	parse_str($urlQuery, $urlQueryArr);
	unset($urlQueryArr[$param]);

	if(count($urlQueryArr))
		return $baseUrl.'?'.http_build_query($urlQueryArr);
	else
		return $baseUrl;
}

Solution 18 - Php

function remove_attribute($url,$attribute)
 {
 	$url=explode('?',$url);
	$new_parameters=false;
	if(isset($url[1]))
	{
		$params=explode('&',$url[1]);
		$new_parameters=ra($params,$attribute);
	}
	$construct_parameters=($new_parameters && $new_parameters!='' ) ? ('?'.$new_parameters):'';
	return $new_url=$url[0].$construct_parameters;
 }
 function ra($params,$attr)
	{	$attr=$attr.'=';
		$new_params=array();
	
		for($i=0;$i<count($params);$i++)
		{	
			$pos=strpos($params[$i],$attr);
	
			if($pos===false)
			$new_params[]=$params[$i];
	
		}
		if(count($new_params)>0)
		return implode('&',$new_params);
		else 
		return false; 
	 }

//just copy the above code and just call this function like this to get new url without particular parameter

echo remove_attribute($url,'delete_params'); // gives new url without that parameter

Solution 19 - Php

I know this is an old question but if you only want to remove one or few named url parameter you can use this function:

function RemoveGet_Regex($variable, $rewritten_url): string {
    $rewritten_url = preg_replace("/(\?)$/", "", preg_replace("/\?&/", "?", preg_replace("/((?<=\?)|&){$variable}=[\w]*/i", "", $rewritten_url)));
    return $rewritten_url;
}
function RemoveGet($name): void {
    $rewritten_url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    if(is_array($name)) {
	    for($i = 0; $i < count($name); $i++) {
		    $rewritten_url = RemoveGet_Regex($name[$i], $rewritten_url);
		    $is_set[] = isset($_GET[$name[$i]]);
	    }
	    $array_filtered = array_filter($is_set);
	    if (!empty($array_filtered)) {
		    header("Location: ".$rewritten_url);
	    }
    }
    else {
	    $rewritten_url = RemoveGet_Regex($name, $rewritten_url);
	    if(isset($_GET[$name])) {
		    header("Location: ".$rewritten_url);
	    }
    }
}

In the first function preg_replace("/((?<=\?)|&){$variable}=[\w]*/i", "", $rewritten_url) will remove the get parameter, and the others will tidy it up. The second function will then redirect.

RemoveGet("id"); will remove the id=whatever from the url. The function can also work with arrays. For your example,

Remove(array("id","Item","return"));

Solution 20 - Php

<? if(isset($_GET['i'])){unset($_GET['i']); header('location:/');} ?>

This will remove the 'i' parameter from the URL. Change the 'i's to whatever you need.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontpowView Question on Stackoverflow
Solution 1 - PhpMarc BView Answer on Stackoverflow
Solution 2 - PhpLars KoudalView Answer on Stackoverflow
Solution 3 - PhpSergey TelshevskyView Answer on Stackoverflow
Solution 4 - PhpNikiCView Answer on Stackoverflow
Solution 5 - PhpkraftbView Answer on Stackoverflow
Solution 6 - PhpShahbaz A.View Answer on Stackoverflow
Solution 7 - PhpAaron HathawayView Answer on Stackoverflow
Solution 8 - PhpdoublejoshView Answer on Stackoverflow
Solution 9 - PhpChuck MorrisView Answer on Stackoverflow
Solution 10 - PhpptmalcolmView Answer on Stackoverflow
Solution 11 - PhpSergeSView Answer on Stackoverflow
Solution 12 - PhpBruno RibeiroView Answer on Stackoverflow
Solution 13 - PhpmguttView Answer on Stackoverflow
Solution 14 - Phpahmed khanView Answer on Stackoverflow
Solution 15 - PhpSanti BarbatView Answer on Stackoverflow
Solution 16 - PhpŠimeView Answer on Stackoverflow
Solution 17 - PhpWhipView Answer on Stackoverflow
Solution 18 - PhpprakashView Answer on Stackoverflow
Solution 19 - Phpm_j_alkarkhiView Answer on Stackoverflow
Solution 20 - PhpJoshua AndersonView Answer on Stackoverflow