Bel modo di rimuovere le variabili GET con PHP?



Answers

Che ne dite di:

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

Ho una stringa con un URL completo che include variabili GET. Qual è il modo migliore per rimuovere le variabili GET? C'è un buon modo per rimuovere solo uno di loro?

Questo è un codice che funziona ma non è molto bello (credo):

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

Il codice sopra rimuove solo tutte le variabili GET. Nel mio caso l'URL è generato da un CMS, quindi non ho bisogno di informazioni sulle variabili del server.




Ispirato dal commento di @MitMaro, ho scritto un piccolo benchmark per testare la velocità delle soluzioni di @Gumbo, @Matt Bridges e @justin la proposta nella domanda:

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;

Risultato: @ justto's strtok è il più veloce.

Nota: testato su un sistema Debian Lenny locale con Apache2 e PHP5.




Non potresti usare le variabili del server per fare questo?

Oppure funzionerebbe ?:

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

Solo un pensiero.




basename($_SERVER['REQUEST_URI']) restituisce tutto dopo e includendo il '?',

Nel mio codice a volte ho bisogno solo di sezioni, quindi separalo in modo da poter ottenere il valore di ciò di cui ho bisogno al volo. Non sono sicuro della velocità delle prestazioni rispetto ad altri metodi, ma è davvero utile per me.

$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;



Che ne dici di una funzione per riscrivere la stringa di query eseguendo il ciclo attraverso l'array $ _GET

! Profilo approssimativo di una funzione adatta

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

Qualcosa di simile sarebbe utile tenere a portata di mano i collegamenti di paginazione, ecc.

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



Links