PHP के साथ GET- चर को हटाने का सुंदर तरीका?


92

मेरे पास एक पूर्ण URL है जिसमें GET चर शामिल हैं। GET वेरिएबल्स को हटाने का सबसे अच्छा तरीका कौन सा है? क्या उनमें से सिर्फ एक को हटाने का एक अच्छा तरीका है?

यह एक कोड है जो काम करता है लेकिन बहुत सुंदर नहीं है (मुझे लगता है):

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

ऊपर दिया गया कोड सभी GET वैरिएबल को हटा देता है। URL मेरे मामले में CMS से उत्पन्न है, इसलिए मुझे सर्वर चर के बारे में कोई जानकारी नहीं चाहिए।


1
जब तक प्रदर्शन में कोई समस्या नहीं होगी, मैं आपके साथ रहूंगा। Gumbo द्वारा दिया गया रेगेक्स समाधान उतना ही सुंदर होने जा रहा है जितना इसे प्राप्त होता है।
मितमरो

यह सुंदर होने की जरूरत नहीं है अगर यह functions.php में जा रहा है या जहां भी आप अपने बदसूरत बिट्स को छिपाते हैं, तो आपको इसे कॉल करने के लिए केवल qs_build () को देखना होगा
प्रश्न मार्क

यहाँ एक अच्छा अनाम फ़ंक्शन के माध्यम से ऐसा करने का एक तरीका है। stackoverflow.com/questions/4937478/…
डबलजोश

Url के टुकड़े के बारे में कैसे? मैं नीचे दिए गए समाधानों को खंड के रूप में अच्छी तरह से त्याग देता हूं, जैसा कि आपका कोड करता है।
मार्टन कोएटिएर

जवाबों:


232

ठीक है, सभी चरों को हटाने के लिए, शायद सबसे सुंदर है

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

strtokयहाँ के बारे में देखें ।

इसका सबसे तेज़ (नीचे देखें), और बिना '' अच्छी तरह।

एक url + querystring लेने के लिए और सिर्फ एक वैरिएबल को हटाने के लिए (बिना रेगेक्स रिप्लेसमेंट का उपयोग किए, जो कुछ मामलों में तेज हो सकता है), आप कुछ ऐसा कर सकते हैं:

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

एक एकल संस्करण को हटाने के लिए एक रेगीक्स लग सकता है जैसे:

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

कुछ अलग-अलग तरीकों की समयावधि का उपयोग करता है, यह सुनिश्चित करता है कि समय-सीमा रीसेट करें

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

दिखाता है

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 रास्ता और भी बेहतर दिखता है। अन्य कार्यों में वह कारगर नहीं था। मैंने इन प्राप्त चर पर कार्य करने की कोशिश की; cearear = 2013 और परीक्षण = मूल्य और लिखा गूंज हटानेवाला ($ current_url, 'cbyear'); और परिणाम मिला: amp; परीक्षण = मूल्य
जेन्स टॉर्नेल

आह हाँ ... रेगेक्स पूरा नहीं हुआ है - इसे अनुगामी परिसीमन को बदलने और अग्रणी एक को याद करने की आवश्यकता होगी (लिखा "अंधा)। लंबा कार्य अभी भी ठीक काम करना चाहिए। preg_replace ('/( /??&ades)..os varname' = = [^ &] + ((| $) / ',' $ 1 ', $ url) काम करना चाहिए
जस्टिन

1
PHP 5.4 में @unset के बारे में शिकायत लगती है - यह @ प्रतीक को, अजीब तरह से पसंद नहीं करता है।
आर्टेम रसाकोवस्की

1
आश्चर्य की बात नहीं - @ ऑपरेटर (त्रुटियों को छिपाएं) वैसे भी बुराई है - शायद PHP 5.4 में अब ऐसा करने का एक बेहतर तरीका है, लेकिन मैं लगभग 2 वर्षों से PHP नहीं लिख रहा हूं, इसलिए मैं थोड़ा बाहर हूं अभ्यास करते हैं।
जस्टिन

स्ट्रैटोक चट्टानें, +1
फ्रांसेस्कोएम

33

कैसा रहेगा:

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

1
निश्चित रूप से सुंदर। मुझे आश्चर्य है कि कौन सा बेहतर प्रदर्शन करेगा। +1
मितमारो

इसने मुझे कुछ पंक्तियों को बचाया और मेरे लिए यह छोटा और सुंदर है। धन्यवाद!
जेन्स टॉर्नेल 16

5
/(\\?|&)the-var=.*?(&|$)/केवल एक विशिष्ट चर ( the-varयहां) को हटाने के लिए उपयोग करें ।

10

यदि आप जिस URL से क्वेरी स्ट्रिंग को निकालने का प्रयास कर रहे हैं वह PHP स्क्रिप्ट का वर्तमान URL है, तो आप पहले बताए गए तरीकों में से एक का उपयोग कर सकते हैं। यदि आपके पास बस एक URL वाला स्ट्रिंग वैरिएबल है और आप 'पिछले सब कुछ' से अलग करना चाहते हैं? ' तुम कर सकते हो:

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

+1 क्योंकि इसका एकमात्र अन्य उत्तर यहाँ है जो प्रश्न का उत्तर देता है और एक विकल्प प्रदान करता है।
मितमरो

2
आपको विचार करना चाहिए कि URL में a नहीं हो सकता है ?। आपका कोड फिर एक रिक्त स्ट्रिंग लौटाएगा।
गंबू 3

वापस करने के लिए क्या @Gumbo ने कहा, मैं दूसरी पंक्ति बदल जाएगा:$url = ($pos)? substr($url, 0, $pos) : $url;
CenterOrbit

7

@MitMaro की टिप्पणी से प्रेरित होकर, मैंने प्रश्न में प्रस्ताव के @Gumbo, @Matt Bridges और @justin के समाधान की गति का परीक्षण करने के लिए एक छोटा बेंचमार्क लिखा:

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; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;
strtok: 0.12; विस्फोट: 0.19; regexp: 0.31; strpos: 0.18;

परिणाम: @ जस्टिन का स्ट्रॉक सबसे तेज़ है।

नोट: Apache2 और PHP5 के साथ एक स्थानीय डेबियन लेनी सिस्टम पर परीक्षण किया गया।


regexp निष्पादन समय: 0.14591598510742 सेकंड; विस्फोट का समय: 0.07137393951416 सेकंड; स्ट्रैप्स निष्पादन समय: 0.080883026123047 सेकंड; टोकन निष्पादन समय: 0.042459011077881 सेकंड;
जस्टिन

बहुत अच्छा! मुझे लगता है कि गति महत्वपूर्ण है। यह केवल एक चीज नहीं है जो होने वाली है। एक वेब एप्लिकेशन में सैकड़ों कार्य हो सकते हैं। "यह सब विवरण में है"। धन्यवाद, मतदान करें!
जेन्स टॉर्नेल

जस्टिन, धन्यवाद। स्क्रिप्ट अब साफ हो गई है और आपके समाधान को ध्यान में रखती है।
17/07

7

एक और समाधान ... मुझे यह समारोह और अधिक सुरुचिपूर्ण लगता है, यह भी पीछे हटा देगा? ' यदि निकालने की कुंजी क्वेरी स्ट्रिंग में केवल एक है।

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

टेस्ट:

$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/>';
}

उत्पादन होगा:

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

»इन परीक्षणों को 3v4l पर चलाएं


3

क्या आप ऐसा करने के लिए सर्वर चर का उपयोग नहीं कर सकते थे?

या यह काम करेगा ?:

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

सिर्फ एक विचार।


2

आप इसके लिए सर्वर चर का उपयोग कर सकते हैं , उदाहरण के लिए $_SERVER['REQUEST_URI'], या इससे भी बेहतर $_SERVER['PHP_SELF']:।


4
यह मानता है कि वह जिस यूआरएल को पार्स कर रहा है वह पेजिंग कर रहा है।
मितमरो


0

$ _GET सरणी के माध्यम से लूप करके क्वेरी स्ट्रिंग को फिर से लिखने के लिए एक फ़ंक्शन के बारे में कैसे

! किसी उपयुक्त कार्य की रूपरेखा

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

कुछ इस तरह से अच्छा होगा कि पेजेशन लिंक आदि के लिए काम करते रहें।

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

0

basename($_SERVER['REQUEST_URI']) 'और' सहित सभी कुछ देता है?

मेरे कोड में कभी-कभी मुझे केवल अनुभागों की आवश्यकता होती है, इसलिए इसे अलग करें ताकि मुझे मक्खी पर मेरी आवश्यकता का मूल्य मिल सके। अन्य तरीकों की तुलना में प्रदर्शन की गति पर निश्चित नहीं है, लेकिन यह वास्तव में मेरे लिए उपयोगी है।

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

0

मेरी राय में, सबसे अच्छा तरीका यह होगा:

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

यह जाँचता है कि क्या कोई 'i' GET पैरामीटर है, और यदि है तो उसे निकाल देता है।


0

स्वयं-सबमिट, रिक्त फ़ॉर्म के साथ किसी भी वैरिएबल के URL से छुटकारा पाने के लिए echo'd जावास्क्रिप्ट का उपयोग करें:

    <?
    if (isset($_GET['your_var'])){
    //blah blah blah code
    echo "<script type='text/javascript'>unsetter();</script>"; 
    ?> 

फिर इस जावास्क्रिप्ट फ़ंक्शन को बनाएं:

    function unsetter() {
    $('<form id = "unset" name = "unset" METHOD="GET"><input type="submit"></form>').appendTo('body');
    $( "#unset" ).submit();
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.