2009-08-09 21 views
76

मेरे पास एक पूर्ण यूआरएल है जिसमें जीईटी चर शामिल हैं। जीईटी चर को हटाने का सबसे अच्छा तरीका कौन सा है? क्या उनमें से केवल एक को हटाने का कोई अच्छा तरीका है?PHP के साथ जीईटी-चर को हटाने का सुंदर तरीका?

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

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

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

+1

मैं आपके पास तब तक रहूंगा जब तक प्रदर्शन कोई मुद्दा न हो। गम्बो द्वारा प्रदान किया गया रेगेक्स समाधान जितना सुंदर हो जाएगा उतना ही होगा। – MitMaro

+0

यदि यह आपके बदसूरत बिट्स को छिपाते हैं तो यह सुंदर होने की आवश्यकता नहीं है, तो आपको केवल –

+0

पर कॉल करने के लिए qs_build() को देखने की आवश्यकता होगी, यह एक अच्छा अनाम फ़ंक्शन के माध्यम से ऐसा करने का एक तरीका है। http://stackoverflow.com/questions/4937478/strip-off-url-parameter-with-php/17287657#17287657 – doublejosh

उत्तर

196

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

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

strtok here के बारे में देखें है।

यह सबसे तेज़ (नीचे देखें), और '?' के बिना यूआरएल संभालता है अच्छी तरह।

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

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

एक regex एक दूर करने के लिए की जगह एकल वर लग सकता है जैसे: सुनिश्चित समय

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

उसके बारे में यहां कुछ अलग अलग तरीकों का समय, रन inbetween रीसेट है।

<?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 जीत है, और अब तक का सबसे छोटा कोड कर रहा है।

+0

ठीक है, मैंने अपना दिमाग बदल दिया। स्ट्रैटोक रास्ता भी बेहतर दिखता है। अन्य कार्यों ने अच्छी तरह से काम नहीं किया। मैंने इन चरों को प्राप्त करने की कोशिश की? Cbyear = 2013 और test = value और echo removeqsvar ($ current_url, 'cbyear') लिखा; और परिणाम मिला: amp; test = value –

+0

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

+2

+1 काम करना चाहिए, किसी और ने सोचा नहीं उस :) – knittl

2

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

+3

यह निश्चित रूप से मानता है कि वह पार्लिंग कर रहा है वह पेज पार्सिंग कर रहा है। – MitMaro

26

कैसे के बारे में:

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

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

+0

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

+0

अभी भी एक उत्थान के लायक है; सबसे छोटा समाधान – Scharrels

7

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

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

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

+1

आपको यह समझना चाहिए कि यूआरएल में '?' नहीं हो सकता है। फिर आपका कोड एक खाली स्ट्रिंग वापस कर देगा। – Gumbo

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

@MitMaro की टिप्पणी से प्रेरित होकर के लिए आसान रखने के लिए अच्छा होगा, मैं परीक्षण करने के लिए एक छोटी सी बेंचमार्क लिखा था

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; 

रेस: @Gumbo, @Matt पुल के समाधान की और सवाल में प्रस्ताव @justin गति अल्ट: @ जस्टिन स्ट्रेटोक सबसे तेज़ है।

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

+0

regexp निष्पादन समय: 0.145 9 15 9 8510742 सेकंड; निष्पादन समय विस्फोट: 0.07137393951416 सेकंड; स्ट्रोज निष्पादन समय: 0.080883026123047 सेकंड; टोक़ निष्पादन समय: 0.042459011077881 सेकंड; – Justin

+0

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

+0

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

0
@list($url) = explode("?", $url, 2); 
2

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

या यह काम ?:

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

बस एक विचार होगा।

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

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

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

» Run these tests on 3v4l

0

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

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

यह जांचता है कि कोई 'i' GET पैरामीटर है, और यदि वहां है तो इसे हटा देता है।

संबंधित मुद्दे