Saya memiliki string dengan URL lengkap termasuk variabel GET. Manakah cara terbaik untuk menghapus variabel GET? Adakah cara yang bagus untuk menghapus salah satunya?
Ini adalah kode yang berfungsi tetapi tidak terlalu bagus (menurut saya):
$current_url = explode('?', $current_url);
echo $current_url[0];
Kode di atas hanya menghapus semua variabel GET. Dalam kasus saya, URL dibuat dari CMS jadi saya tidak memerlukan informasi apa pun tentang variabel server.
Jawaban:
Oke, untuk menghapus semua variabel, mungkin yang tercantik adalah
$url = strtok($url, '?');
Lihat tentang di
strtok
sini .Ini yang tercepat (lihat di bawah), dan menangani url tanpa '?' tepat.
Untuk mengambil url + querystring dan menghapus hanya satu variabel (tanpa menggunakan regex replace, yang mungkin lebih cepat dalam beberapa kasus), Anda dapat melakukan sesuatu seperti:
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; }
Penggantian regex untuk menghapus satu var mungkin terlihat seperti:
function removeqsvar($url, $varname) { return preg_replace('/([?&])'.$varname.'=[^&]+(&|$)/','$1',$url); }
Berikut adalah pengaturan waktu dari beberapa metode yang berbeda, memastikan pengaturan waktu diatur ulang di antara proses.
<?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; ";
acara
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 menang, dan sejauh ini merupakan kode terkecil.
sumber
Bagaimana tentang:
preg_replace('/\\?.*/', '', $str)
sumber
/(\\?|&)the-var=.*?(&|$)/
untuk menghapus hanya variabel tertentu (dithe-var
sini).Jika URL tempat Anda mencoba menghapus string kueri adalah URL skrip PHP saat ini, Anda dapat menggunakan salah satu metode yang disebutkan sebelumnya. Jika Anda hanya memiliki variabel string dengan URL di dalamnya dan Anda ingin menghapus semuanya setelah '?' Anda dapat melakukan:
$pos = strpos($url, "?"); $url = substr($url, 0, $pos);
sumber
?
. Kode Anda kemudian akan mengembalikan string kosong.$url = ($pos)? substr($url, 0, $pos) : $url;
Terinspirasi oleh komentar @MitMaro, saya menulis patokan kecil untuk menguji kecepatan solusi @Gumbo, @Matt Bridges dan @justin proposal dalam pertanyaan:
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 />"; }
Hasilnya: strtok @ justin's paling cepat.
Catatan: diuji pada sistem Debian Lenny lokal dengan Apache2 dan PHP5.
sumber
Solusi lain ... Menurut saya fungsi ini lebih elegan, ini juga akan menghilangkan tanda '?' jika kunci yang akan dihapus adalah satu-satunya di string kueri.
/** * 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; }
Tes:
$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/>'; }
Akan menghasilkan:
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
»Jalankan pengujian ini pada 3v4l
sumber
Tidak bisakah Anda menggunakan variabel server untuk melakukan ini?
Atau apakah ini akan berhasil ?:
unset($_GET['page']); $url = $_SERVER['SCRIPT_NAME'] ."?".http_build_query($_GET);
Hanya pemikiran saja.
sumber
Anda dapat menggunakan variabel server untuk ini, misalnya
$_SERVER['REQUEST_URI']
, atau bahkan lebih baik:$_SERVER['PHP_SELF']
.sumber
@list($url) = explode("?", $url, 2);
sumber
Bagaimana dengan sebuah fungsi untuk menulis ulang string kueri dengan mengulang melalui array $ _GET
! Garis besar kasar dari fungsi yang sesuai
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); }
Sesuatu seperti ini sebaiknya tetap berguna untuk tautan pagination, dll.
<a href="?p=3&<?= query_string_exclude(array('p')) ?>" title="Click for page 3">Page 3</a>
sumber
basename($_SERVER['REQUEST_URI'])
mengembalikan semuanya setelah dan termasuk '?',Dalam kode saya kadang-kadang saya hanya membutuhkan bagian, jadi pisahkan sehingga saya bisa mendapatkan nilai dari apa yang saya butuhkan dengan cepat. Tidak yakin dengan kecepatan kinerja dibandingkan dengan metode lain, tetapi ini sangat berguna bagi saya.
$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;
sumber
Menurut saya, cara terbaik adalah ini:
<? if(isset($_GET['i'])){unset($_GET['i']); header('location:/');} ?>
Ia memeriksa apakah ada parameter 'i' GET, dan menghapusnya jika ada.
sumber
cukup gunakan javascript bergema untuk menghapus URL variabel apa pun dengan formulir kosong yang dikirim sendiri:
<? if (isset($_GET['your_var'])){ //blah blah blah code echo "<script type='text/javascript'>unsetter();</script>"; ?>
Kemudian buat fungsi javascript ini:
function unsetter() { $('<form id = "unset" name = "unset" METHOD="GET"><input type="submit"></form>').appendTo('body'); $( "#unset" ).submit(); }
sumber