PHP ile GET-değişkenleri çıkarmak için güzel bir yoldur?

8 Cevap php

Ben GET değişkenleri içeren tam bir URL ile bir dize var. Hangi GET değişkenleri kaldırmak için en iyi yolu nedir? Sadece bunlardan birini kaldırmak için güzel bir yolu var mı?

Bu çalışır ama (bence) çok güzel olmayan bir koddur:

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

Yukarıdaki kod sadece tüm GET değişkenleri kaldırır. URL yüzden sunucu değişkenleri hakkında herhangi bir bilgi gerekmez bir CMS oluşturulan benim durumumda olduğunu.

8 Cevap

Tamam, tüm değişkenleri kaldırmak için, belki de güzel olduğunu

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

strtok burada hakkında bakın.

Onun (aşağıya bakınız) hızlı, ve bir olmadan adresler kolları '?' düzgün.

Bir url + sorgu dizesi alır ve (bazı durumlarda daha hızlı olabilir ki, bir regex yerine kullanmadan) sadece tek bir değişkeni kaldırmak için, senin gibi bir şey olabilir:

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

Bir regex tek VAR kaldırmak yerine gibi görünebilir:

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

Birkaç farklı yöntemler İşte zamanlamaları, zamanlama sağlayarak çalışır inbetween sıfırlanır.

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

gösterileri

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 kazanır ve çok küçük kod gereğidir.

Nasıl hakkında:

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

@ MitMaro bir açıklama esinlenerek, ben söz teklifin Matt Köprü ve @ @ justin, bamya @ çözümlerinin hızını test etmek için küçük bir kriter yazdı:

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;

Sonuç: Justin'in strtok'un @ hızlı.

Not: Apache2'nin ve PHP5 ile yerel bir Debian Lenny sistemi üzerinde test edilmiştir.

Örneğin $_SERVER['REQUEST_URI'], bunun için server variables kullanabilir, hatta daha iyi olabilir: $_SERVER['PHP_SELF'].

Eğer gelen sorgu dizesi kaldırmaya çalıştığınız URL PHP script geçerli URL ise, yukarıda açıklanan yöntemlerden birini kullanabilirsiniz. Eğer sadece bir URL ile bir dize değişkeni varsa ve geçmiş her şey kapalı şerit istediğiniz '?' Yapabileceğiniz:

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

Nasıl $ _GET dizi döngü ile sorgu dizesini yeniden yazmak için bir işlevi hakkında

! Uygun bir fonksiyonun kaba taslak

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

Böyle bir şey vb sayfa bağlantıları için kullanışlı tutmak için iyi olurdu

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

Bunu yapmak için sunucu değişkenleri kullanmak değil misiniz?

Ya da bu işi istiyorsunuz?:

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

Sadece bir düşünce.

basename($_SERVER['REQUEST_URI']) sonra dahil her şeyi verir, '?'

In my code sometimes I need only sections, so separate it out so I can get the value of what I need on the fly. Not sure on the performance speed compared to other methods, but it's really useful for 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;