পিএইচপি দিয়ে জিইটি-ভেরিয়েবলগুলি সরানোর সুন্দর উপায়?


94

জিইটি ভেরিয়েবল সহ পুরো URL সহ আমার স্ট্রিং রয়েছে। জিইটি ভেরিয়েবলগুলি মুছে ফেলার সেরা উপায় কোনটি? এর মধ্যে একটির সরানোর কোনও দুর্দান্ত উপায় আছে কি?

এটি এমন একটি কোড যা কাজ করে তবে খুব সুন্দর হয় না (আমার মনে হয়):

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

উপরের কোডটি সমস্ত জিইটি ভেরিয়েবল সরিয়ে দেয়। ইউআরএলটি আমার ক্ষেত্রে একটি সিএমএস থেকে তৈরি তাই আমার সার্ভার ভেরিয়েবল সম্পর্কে কোনও তথ্যের প্রয়োজন নেই।


4
পারফরম্যান্স কোনও সমস্যা না হলে আপনার যা আছে তা আমি আটকে রাখব। গম্বোর দ্বারা সরবরাহিত রেজেক্স সমাধানটি যতটা সুন্দর হবে তেমন সুন্দর হতে চলেছে।
মিটমারো

এটি ফাংশন.এইচপিপি বা আপনার কুৎসিত বিটগুলি যে কোনও জায়গায় লুকিয়ে রাখলে এটি সুন্দর হওয়ার দরকার নেই, আপনাকে এটি কল করতে কেবল qs_build () দেখতে হবে
প্রশ্ন মার্ক

একটি সুন্দর বেনাম ফাংশন মাধ্যমে এটি করার একটি উপায় এখানে। stackoverflow.com/questions/4937478/...
doublejosh

ইউআরএল খণ্ড সম্পর্কে কীভাবে? নীচের সমস্ত সমাধান আমি দেখতে পাচ্ছি তেমনি খণ্ডটিও বাতিল করে দেয় ঠিক যেমন আপনার কোড করে।
মার্টেন কোয়েটিসিয়র

উত্তর:


236

ঠিক আছে, সমস্ত ভেরিয়েবলগুলি মুছে ফেলতে, সম্ভবত সবচেয়ে সুন্দর

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

strtokএখানে দেখুন ।

এটি সবচেয়ে দ্রুত (নীচে দেখুন), এবং একটি 'ছাড়াই ইউআরএলগুলি পরিচালনা করে?' সঠিকভাবে

একটি ইউআরএল + ক্যোরিস্ট্রিং নিতে এবং মাত্র একটি ভেরিয়েবল অপসারণ করতে (একটি রেজেক্স রিপ্লেস ব্যবহার না করে, যা কিছু ক্ষেত্রে দ্রুত হতে পারে) আপনি কিছু করতে পারেন:

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 জিতেছে এবং এটি এখন পর্যন্ত সবচেয়ে ছোট কোড।


ঠিক আছে, আমি আমার মন পরিবর্তন করেছি। strtok উপায় আরও ভাল দেখায়। অন্যান্য ফাংশনগুলি সেভাবে কার্যকর হয়নি। আমি এইগুলি ভেরিয়েবলগুলি পেতে ফাংশনগুলি চেষ্টা করেছি? Cbyear = 2013 & পরীক্ষা = মান এবং ইকো রিমুভস্ক্রওয়ার ($ কারেন্ট_ুরল, 'সিবিয়ার') লিখেছি; এবং ফলাফলটি পেয়েছে: এমপি; পরীক্ষা = মান
জেনস টার্নেল

আহা হ্যাঁ ... রেজেক্স সম্পূর্ণ নয় - এটির পিছনের ডিলিমিটারটি প্রতিস্থাপন করতে হবে এবং শীর্ষস্থানীয়টিকে মিস করতে হবে (এটি অন্ধ লিখেছেন)। দীর্ঘতর ফাংশনটি এখনও ঠিক কাজ করা উচিত। প্রিগ_রেপ্লেস ('/(sel?&D)'.$ বর্ণমালা।' = [^ &] + (& | $) / ',' $ 1 ', $ url) কাজ করা উচিত
জাস্টিন

4
পিএইচপি 5.4 @ ইউনাইট সম্পর্কে অভিযোগ বলে মনে হচ্ছে - এটি অদ্ভুতভাবে @ প্রতীক পছন্দ করে না।
আর্টেম রাশাকোভস্কিই

4
অবাক হওয়ার মতো কিছু নেই - @ অপারেটর (ত্রুটিগুলি আড়াল করা) যেভাবেই হোক না কেন এটি খারাপ উপায় evil এখন পিএইচপি 5.4-তে এটি করার আরও ভাল উপায় রয়েছে তবে আমি প্রায় 2 বছর ধরে পিএইচপি লিখছি না তাই আমি কিছুটা দূরে আছি অনুশীলন করা.
জাস্টিন 21

স্ট্রোকক শিলা, +1
ফ্রান্সেসকোএমএম

33

কেমন:

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

4
অবশ্যই সুন্দর। আমি আশ্চর্য হই যে কোনটি আরও ভাল পারফর্ম করবে। +1
মিটমারো

এটি আমাকে কয়েক সারি বাঁচিয়েছে এবং আমার কাছে এটি সংক্ষিপ্ত এবং সুন্দর। ধন্যবাদ!
জেনস টার্নেল

4
/(\\?|&)the-var=.*?(&|$)/শুধুমাত্র একটি নির্দিষ্ট ভেরিয়েবল অপসারণ করতে ব্যবহার করুন ( the-varএখানে)।

10

আপনি যে URL টি থেকে কোয়েরি স্ট্রিংটি সরিয়ে দেওয়ার চেষ্টা করছেন তা যদি পিএইচপি স্ক্রিপ্টের বর্তমান URL হয় তবে আপনি পূর্ব বর্ণিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করতে পারেন। যদি আপনার কেবলমাত্র একটি URL এর সাথে একটি স্ট্রিং ভেরিয়েবল থাকে এবং আপনি 'অতীত' সমস্ত কিছু সরিয়ে ফেলতে চান? ' আপনি করতে পারেন:

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

+1 কারণ এটি এখানে কেবলমাত্র অন্য উত্তর যা প্রশ্নের উত্তর দেয় এবং একটি বিকল্প সরবরাহ করে।
মিটমারো

4
আপনার বিবেচনা করা উচিত যে URL টিতে একটি নাও থাকতে পারে ?। আপনার কোডটি পরে একটি খালি স্ট্রিং ফিরে আসবে।
গম্বো

হ্যাঁ, গম্বো যা বলেছিল তা ফিরিয়ে দিতে, আমি দ্বিতীয় লাইনটি এতে পরিবর্তন করব:$url = ($pos)? substr($url, 0, $pos) : $url;
সেন্টারঅরবিত

7

@ মিটমারোর মন্তব্যে অনুপ্রাণিত হয়ে আমি @ গম্বো, @ ম্যাট ব্রিজ এবং সমাধানের প্রস্তাবটির প্রশ্নের সমাধানের গতি পরীক্ষা করার জন্য একটি ছোট্ট মানদণ্ড লিখেছি:

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 />";
}
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;
স্ট্রটোক: 0.12; বিস্ফোরিত: 0.19; রিজেপ্সপ: 0.31; স্ট্রপোস: 0.18;

ফলাফল: @ জাস্টিনের স্ট্রটোক সবচেয়ে দ্রুত।

দ্রষ্টব্য: অ্যাপাচি 2 এবং পিএইচপি 5 এর সাথে স্থানীয় ডেবিয়ান লেনি সিস্টেমে পরীক্ষিত।


রিজেক্সপ এক্সিকিউশন সময়: 0.14591598510742 সেকেন্ড; বিস্ফোরণ কার্যকর সময়: 0.07137393951416 সেকেন্ড; strpos সম্পাদনের সময়: 0.080883026123047 সেকেন্ড; টোক প্রয়োগের সময়: 0.042459011077881 সেকেন্ড;
জাস্টিন 16

খুব সুন্দর! আমি গতি গুরুত্বপূর্ণ বলে মনে করি। এটি কেবল ঘটতে চলেছে না। একটি ওয়েব অ্যাপ্লিকেশনটিতে কয়েকশ ফাংশন থাকতে পারে। "বিস্তারিত এই সব"। ধন্যবাদ, ভোট দিন!
জেনস টার্নেল

জাস্টিন, ধন্যবাদ। স্ক্রিপ্টটি এখন পরিষ্কার হয়ে গেছে এবং আপনার সমাধানটিকে বিবেচনায় নিয়েছে।
Scharrels

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

V 3v4l এ এই পরীক্ষাগুলি চালান


3

আপনি এটি করতে সার্ভার ভেরিয়েবলগুলি ব্যবহার করতে পারেন না?

অথবা এই কাজ করবে ?:

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

শুধু একটি ভাবনা.


2

আপনি ব্যবহার করতে পারেন সার্ভার ভেরিয়েবল , উদাহরণস্বরূপ এই জন্য $_SERVER['REQUEST_URI']আরও ভাল, বা: $_SERVER['PHP_SELF']


4
এটি অবশ্যই ধরে নিয়েছে যে তিনি যে url পার্স করছেন সেটি হ'ল পৃষ্ঠাটি বিশ্লেষণ করছে ars
মিটমারো


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

পৃষ্ঠার লিঙ্কগুলি ইত্যাদির জন্য কিছু সহজ রাখার জন্য ভাল be

<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:/');} ?>

এটি 'আই' জিইটি প্যারামিটার আছে কিনা তা পরীক্ষা করে এবং সেখানে থাকলে এটি সরিয়ে দেয়।


0

স্ব-জমা দেওয়ার, ফাঁকা ফর্মের মাধ্যমে কোনও ভেরিয়েবলের URL মুছে ফেলার জন্য কেবল প্রতিধ্বনিত জাভাস্ক্রিপ্ট ব্যবহার করুন:

    <?
    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();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.