sirve recibir que para method ejemplo _request _post _get php url variables get

que - recibir variables get php



¿Una forma hermosa de eliminar variables GET con PHP? (11)

¿No podrías usar las variables del servidor para hacer esto?

¿O esto funcionaría ?:

unset($_GET[''page'']); $url = $_SERVER[''SCRIPT_NAME''] ."?".http_build_query($_GET);

Solo un pensamiento.

Tengo una cadena con una URL completa que incluye variables GET. ¿Cuál es la mejor manera de eliminar las variables GET? ¿Hay alguna buena manera de eliminar solo uno de ellos?

Este es un código que funciona pero que no es muy bonito (creo):

$current_url = explode(''?'', $current_url); echo $current_url[0];

El código anterior simplemente elimina todas las variables GET. En mi caso, la URL se genera desde un CMS, por lo que no necesito información sobre las variables del servidor.


¿Qué tal una función para reescribir la cadena de consulta al recorrer la matriz $ _GET?

! Esquema aproximado de una función adecuada

function query_string_exclude($exclude, $subject = $_GET, $array_prefix=''''){ $query_params = array; foreach($subject as $key=>$var){ if(!in_array($key,$exclude)){ if(is_array($var)){ //recursive call into sub array $query_params[] = query_string_exclude($exclude, $var, $array_prefix.''[''.$key.'']''); }else{ $query_params[] = (!empty($array_prefix)?$array_prefix.''[''.$key.'']'':$key).''=''.$var; } } } return implode(''&'',$query_params); }

Algo como esto sería bueno para tenerlo a mano para los enlaces de paginación, etc.

<a href="?p=3&<?= query_string_exclude(array(''p'')) ?>" title="Click for page 3">Page 3</a>


En mi opinión, la mejor manera sería esta:

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

Comprueba si hay un parámetro ''i'' GET y lo elimina si lo hay.


Inspirado por el comentario de @MitMaro, escribí un pequeño punto de referencia para probar la velocidad de las soluciones de @Gumbo, @Matt Bridges y @justin en la propuesta en la pregunta:

function teststrtok($number_of_tests){ for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; $str = strtok($str,''?''); } } function testexplode($number_of_tests){ for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; $str = explode(''?'', $str); } } function testregexp($number_of_tests){ for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; preg_replace(''///?.*/'', '''', $str); } } function teststrpos($number_of_tests){ for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; $qPos = strpos($str, "?"); $url_without_query_string = substr($str, 0, $qPos); } } $number_of_runs = 10; for($runs = 0; $runs < $number_of_runs; $runs++){ $number_of_tests = 40000; $functions = array("strtok", "explode", "regexp", "strpos"); foreach($functions as $func){ $starttime = microtime(true); call_user_func("test".$func, $number_of_tests); echo $func.": ". sprintf("%0.2f",microtime(true) - $starttime).";"; } echo "<br />"; }

strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18; strtok: 0.12;explode: 0.19;regexp: 0.31;strpos: 0.18;

Resultado: el strtok de @ justin es el más rápido.

Nota: probado en un sistema Debian Lenny local con Apache2 y PHP5.


Ok, para eliminar todas las variables, tal vez la más bonita es

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

Ver sobre strtok aquí .

Es el más rápido (ver abajo), y maneja las URL sin un ''?'' correctamente.

Para tomar url + querystring y eliminar solo una variable (sin usar una regex replace, que puede ser más rápida en algunos casos), puede hacer algo como:

function removeqsvar($url, $varname) { list($urlpart, $qspart) = array_pad(explode(''?'', $url), 2, ''''); parse_str($qspart, $qsvars); @unset($qsvars[$varname]); $newqs = http_build_query($qsvars); return $urlpart . ''?'' . $newqs; }

Una regex replace para eliminar una sola var podría verse así:

function removeqsvar($url, $varname) { return preg_replace(''/([?&])''.$varname.''=[^&]+(&|$)/'',''$1'',$url); }

Aquí está el tiempo de algunos métodos diferentes, asegurando que el tiempo se reinicie entre las carreras.

<?php $number_of_tests = 40000; $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; preg_replace(''///?.*/'', '''', $str); } $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); echo "regexp execution time: ".$totaltime." seconds; "; $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; $str = explode(''?'', $str); } $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); echo "explode execution time: ".$totaltime." seconds; "; $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; $qPos = strpos($str, "?"); $url_without_query_string = substr($str, 0, $qPos); } $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); echo "strpos execution time: ".$totaltime." seconds; "; $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; for($i = 0; $i < $number_of_tests; $i++){ $str = "http://www.example.com?test=test"; $url_without_query_string = strtok($str, ''?''); } $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); echo "tok execution time: ".$totaltime." seconds; ";

muestra

regexp execution time: 0.14604902267456 seconds; explode execution time: 0.068033933639526 seconds; strpos execution time: 0.064775943756104 seconds; tok execution time: 0.045819044113159 seconds; regexp execution time: 0.1408839225769 seconds; explode execution time: 0.06751012802124 seconds; strpos execution time: 0.064877986907959 seconds; tok execution time: 0.047760963439941 seconds; regexp execution time: 0.14162802696228 seconds; explode execution time: 0.065848112106323 seconds; strpos execution time: 0.064821004867554 seconds; tok execution time: 0.041788101196289 seconds; regexp execution time: 0.14043688774109 seconds; explode execution time: 0.066350221633911 seconds; strpos execution time: 0.066242933273315 seconds; tok execution time: 0.041517972946167 seconds; regexp execution time: 0.14228296279907 seconds; explode execution time: 0.06665301322937 seconds; strpos execution time: 0.063700199127197 seconds; tok execution time: 0.041836977005005 seconds;

strtok gana, y es de lejos el código más pequeño.


Otra solución ... ¿Encuentro esta función más elegante, también eliminará el rastro ''?'' si la clave para eliminar es la única en la cadena de consulta.

/** * Remove a query string parameter from an URL. * * @param string $url * @param string $varname * * @return string */ function removeQueryStringParameter($url, $varname) { $parsedUrl = parse_url($url); $query = array(); if (isset($parsedUrl[''query''])) { parse_str($parsedUrl[''query''], $query); unset($query[$varname]); } $path = isset($parsedUrl[''path'']) ? $parsedUrl[''path''] : ''''; $query = !empty($query) ? ''?''. http_build_query($query) : ''''; return $parsedUrl[''scheme'']. ''://''. $parsedUrl[''host'']. $path. $query; }

Pruebas:

$urls = array( ''http://www.example.com?test=test'', ''http://www.example.com?bar=foo&test=test2&foo2=dooh'', ''http://www.example.com'', ''http://www.example.com?foo=bar'', ''http://www.example.com/test/no-empty-path/?foo=bar&test=test5'', ''https://www.example.com/test/test.test?test=test6'', ); foreach ($urls as $url) { echo $url. ''<br/>''; echo removeQueryStringParameter($url, ''test''). ''<br/><br/>''; }

Se producirá:

http://www.example.com?test=test http://www.example.com http://www.example.com?bar=foo&test=test2&foo2=dooh http://www.example.com?bar=foo&foo2=dooh http://www.example.com http://www.example.com http://www.example.com?foo=bar http://www.example.com?foo=bar http://www.example.com/test/no-empty-path/?foo=bar&test=test5 http://www.example.com/test/no-empty-path/?foo=bar https://www.example.com/test/test.test?test=test6 https://www.example.com/test/test.test

»Ejecute estas pruebas en 3v4l


Puede usar las variables del servidor para esto, por ejemplo $_SERVER[''REQUEST_URI''] , o incluso mejor: $_SERVER[''PHP_SELF''] .


Qué tal si:

preg_replace(''///?.*/'', '''', $str)


Si la URL de la que está intentando eliminar la cadena de consulta es la URL actual del script PHP, puede usar uno de los métodos mencionados anteriormente. Si solo tiene una variable de cadena con una URL y desea quitar todo lo que pasa después del ''?'' tu puedes hacer:

$pos = strpos($url, "?"); $url = substr($url, 0, $pos);


basename($_SERVER[''REQUEST_URI'']) devuelve todo después e incluye el ''?'',

En mi código, a veces solo necesito secciones, por lo tanto, sepárelas para que pueda obtener el valor de lo que necesito sobre la marcha. No estoy seguro de la velocidad de rendimiento en comparación con otros métodos, pero es realmente útil para mí.

$urlprotocol = ''http''; if ($_SERVER["HTTPS"] == "on") {$urlprotocol .= "s";} $urlprotocol .= "://"; $urldomain = $_SERVER["SERVER_NAME"]; $urluri = $_SERVER[''REQUEST_URI'']; $urlvars = basename($urluri); $urlpath = str_replace($urlvars,"",$urluri); $urlfull = $urlprotocol . $urldomain . $urlpath . $urlvars;


@list($url) = explode("?", $url, 2);