99 votes

Belle façon de supprimer les variables GET avec PHP?

J'ai une chaîne avec une URL complète, y compris les variables GET. Quel est le meilleur moyen de supprimer les variables GET? Y a-t-il un bon moyen d'enlever un seul?

C'est un code qui fonctionne mais qui n'est pas très beau (je pense):

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

Le code ci-dessus supprime simplement toutes les variables GET. L'URL est dans mon cas générée à partir d'un CMS, je n'ai donc besoin d'aucune information sur les variables du serveur.

250voto

Justin Points 2723

Ok, pour enlever toutes les variables, peut-être la plus jolie est

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

Voir à propos de l' strtok ici.

Son la manière la plus rapide (voir ci-dessous), et gère les url sans un '?' correctement.

Pour prendre une url+querystring et supprimer une variable (sans l'aide d'une regex pour remplacer, ce qui peut être plus rapide dans certains cas), vous pourriez faire quelque chose comme:

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

Une regex remplacer pour supprimer un seul var pourrait ressembler à:

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

Voici les horaires de quelques méthodes différentes, en veillant à ce calendrier est remis entre les deux pistes.

<?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; ";

montre

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 victoires, et est de loin le plus petit code.

34voto

Gumbo Points 279147

Que diriez-vous:

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

10voto

Matt Bridges Points 14547

Si l'URL à partir de laquelle vous essayez de supprimer la chaîne de requête est l'URL actuelle du script PHP, vous pouvez utiliser l'une des méthodes précédemment mentionnées. Si vous avez juste une variable de chaîne avec une URL et que vous voulez effacer tout ce qui se trouve après le "?" tu peux faire:

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

7voto

Scharrels Points 2214

Inspiré par le commentaire de @MitMaro, j'ai écrit un petit benchmark pour tester la vitesse de solutions de @Gumbo, @Matt Ponts et @justin la proposition en question:

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;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;
strtok: 0.12;exploser: 0.19;regexp: 0.31;strpos: 0.18;

Résultat: @justin strtok est le plus rapide.

Remarque: testé sur un local système Debian Lenny avec Apache2 et PHP5.

2voto

Scharrels Points 2214

Vous pouvez utiliser les variables de serveur à cet effet, par exemple $_SERVER['REQUEST_URI'] , voire mieux: $_SERVER['PHP_SELF'] .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X