GET পরামিতি যুক্ত করে একটি url স্ট্রিং ম্যানিপুলেট করুন


93

আমি ইউআরএলগুলিতে জিইটি প্যারামিটার যুক্ত করতে চাই যা পুনরাবৃত্তি না করে ?বা জিইটি প্যারামিটারগুলি নাও থাকতে পারে &

উদাহরণ:

আমি যদি যোগ করতে চান category=action

$url="http://www.acme.com";
 // will add ?category=action at the end

$url="http://www.acme.com/movies?sort=popular";
 // will add &category=action at the end

আপনি যদি লক্ষ্য করেন যে আমি যদি প্রশ্ন চিহ্নটি পাওয়া যায় তবে পুনরাবৃত্তি না করার চেষ্টা করছি।

URL টি কেবল একটি স্ট্রিং।

নির্দিষ্ট জিইটি প্যারামিটার যুক্ত করার একটি নির্ভরযোগ্য উপায় কী?


কেবলমাত্র ব্যবহার করুন: echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);। তবে আপনার প্রয়োজন pecl install pecl_httpবা সুরকারের মাধ্যমে জ্যাকাসমিথ / http_build_url ইনস্টল করতে হবে ।
Ema4rl

উত্তর:


188

বেসিক পদ্ধতি

$query = parse_url($url, PHP_URL_QUERY);

// Returns a string if the URL has parameters or NULL if not
if ($query) {
    $url .= '&category=1';
} else {
    $url .= '?category=1';
}

আরো উন্নত

$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';

$url_parts = parse_url($url);
// If URL doesn't have a query string.
if (isset($url_parts['query'])) { // Avoid 'Undefined index: query'
    parse_str($url_parts['query'], $params);
} else {
    $params = array();
}

$params['category'] = 2;     // Overwrite if exists
$params['tags'][] = 'cool';  // Allows multiple values

// Note that this will url_encode all values
$url_parts['query'] = http_build_query($params);

// If you have pecl_http
echo http_build_url($url_parts);

// If not
echo $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query'];

আপনার ক্লাস না হলেও কমপক্ষে একটি ফাংশনে এটি করা উচিত।


4
বিভাগের মান যুক্ত করতে ভুলবেন না
ডগ টি।

4
@ ডগটি সমস্ত পরামিতি একটি মান প্রয়োজন হয় না। উদাহরণস্বরূপ, ?logoutসাথে চেক করা যাবেisset($_GET["logout"])
rybo111

এই পদ্ধতিটি ভাল যখন আপনি জানেন যে 'বিভাগ' প্যারামিটারটি ইতিমধ্যে ইউআরএলে নেই। যদি প্যারামিটারটি ইতিমধ্যে কোনও ইউআরএলটিতে থাকে তবে পিএইচপি ইউআরএলটিতে প্যারামিটারের সর্বশেষ উপস্থিতির মান গ্রহণ করা উচিত, সুতরাং @ অ্যান্ড্রুটবার এর সমাধান এখনও কাজ করে। তবুও, আমি নীচের সমাধানটি স্ট্যাকওভারফ্লো . com/a/4101638/99256 আরও ভাল পছন্দ করি।
মার্টিন ভ্যাসেটিকা

প্যারামিটারটি ইতিমধ্যে বিদ্যমান থাকলে প্রতিস্থাপন না করার জন্য -1। এটি প্রশ্নের মধ্যে সুস্পষ্টভাবে উল্লেখ করা হয়নি, তবে এটি যৌক্তিক এবং শব্দার্থগতভাবে বাধ্যতামূলক।
ড্যানিয়েল ডাব্লু।

4
কেবলমাত্র ব্যবহার করুন: echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);। তবে আপনার প্রয়োজন pecl install pecl_httpবা সুরকারের মাধ্যমে জ্যাকাসমিথ / http_build_url ইনস্টল করতে হবে ।
Ema4rl

55

গৃহীত উত্তরের একটি সংক্ষিপ্ত সংস্করণ এখানে:

$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';

সম্পাদনা: গৃহীত উত্তরে আলোচিত হিসাবে এটি ত্রুটিযুক্ত যে এটি categoryইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে না । $_GETএটির জন্য - একটি অ্যারে - এবং এর মতো ফাংশনগুলি ব্যবহার করার জন্য আরও ভাল সমাধান হ'ল in_array()


দ্রষ্টব্য, এটি কেবলমাত্র একটি একক যুক্ত প্যারামিটার দিয়ে কাজ করবে, অন্যথায় এটি সংযোজন করবে? যদি কোনও মূল কোয়েরি না থাকে।
এমগামের্জ

@ এমগামেরজ যদি না আমি আপনাকে ভুল বোঝে, তবে ওপি এটিই চেয়েছিল। এটি একাধিকবার কাজ করে, কারণ এর .আগে =
rybo111

আপনি যদি ইউআরএলে একটি প্যারামিটার যুক্ত করেন (তবে একটি যুক্ত করছেন?) এবং আপনি যদি আবার এটি করেন তবে এটি অন্যটিকে যুক্ত করবে যদি তবে ক্যোরির উপস্থিতি নেই? (যদি না আপনি প্রথম লাইনটি আবার চালাবেন)? কীভাবে $ কোয়েরি আপডেট হবে?
এমগামেরজ

@ এমগামেরজ আমি দেখতে পাচ্ছি আপনি এখন কী বোঝাতে চেয়েছেন হ্যাঁ, $urlইতিমধ্যে প্যারামিটার রয়েছে কিনা তা যাচাই করতে আপনাকে প্রতিবার প্রথম লাইনের পুনরাবৃত্তি করতে হবে । সম্পাদিত।
rybo111

4
ইউআরএলগুলি হ্যান্ডেল করে না #
NateS

19
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

$queryString =  http_build_query($data);
//$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor

echo 'http://domain.com?'.$queryString;
//output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor

কেবলমাত্র ব্যবহার করুন: echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);। তবে আপনার প্রয়োজন pecl install pecl_httpবা সুরকারের মাধ্যমে জ্যাকাসমিথ / http_build_url ইনস্টল করতে হবে ।
Ema4rl

8

একটি সনাক্ত করতে স্ট্রপোস ব্যবহার করুন ? থেকে ? কেবলমাত্র ক্যোয়ারী স্ট্রিংয়ের শুরুতে ইউআরএলে উপস্থিত হতে পারে, আপনি যদি জানেন যে এটির আগে থেকেই প্যারামগুলি উপস্থিত রয়েছে এবং আপনি এবং

function addGetParamToUrl(&$url, $varName, $value)
{
    // is there already an ?
    if (strpos($url, "?"))
    {
        $url .= "&" . $varName . "=" . $value; 
    }
    else
    {
        $url .= "?" . $varName . "=" . $value;
    }
}

পারফরম্যান্সের বিষয়ে আপনি যদি উদ্বিগ্ন হন তবে ভাল এবং সহজ পদ্ধিতি, যেহেতু এটি পার্স_উর্ল এর চেয়ে অনেক দ্রুত এবং কম সিপিইউ নিবিড় হবে। ট্রেডঅফ হ'ল এটি কোনও বিদ্যমান $ varName অনুসন্ধান করছে না।
ডেনিস স্টেকেন

8

এই ফাংশনটি একটি বিদ্যমান যুক্তিকে ওভাররাইট করে

function addToURL( $key, $value, $url) {
    $info = parse_url( $url );
    parse_str( $info['query'], $query );
    return $info['scheme'] . '://' . $info['host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) );
}

$info['query']সেট না থাকলে কী হয় ? আপনি এর জন্য হিসাব করেন নি
ড্যারেন

যদি সেট না করা থাকে তবে $ তথ্য ['ক্যোয়ারী'] নুল হয়ে যায় এবং $ ক্যোয়ারী একটি ফাঁকা অ্যারে হয়ে যায়। সুতরাং এটি একটি সমস্যা নয়।
অজয় সিংহ

7

বিদ্যমান পরামিতিগুলি আপডেট করার উদাহরণ।

এছাড়াও url_encode ব্যবহৃত হয়েছে, এবং প্যারামিটার মান নির্দিষ্ট না করার সম্ভাবনা

    <?
    /**
     * Add parameter to URL
     * @param string $url
     * @param string $key
     * @param string $value
     * @return string result URL
     */
    function addToUrl($url, $key, $value = null) {
        $query = parse_url($url, PHP_URL_QUERY);
        if ($query) {
            parse_str($query, $queryParams);
            $queryParams[$key] = $value;
            $url = str_replace("?$query", '?' . http_build_query($queryParams), $url);
        } else {
            $url .= '?' . urlencode($key) . '=' . urlencode($value);
        }
        return $url;
    }

5
<?php
$url1 = '/test?a=4&b=3';
$url2 = 'www.baidu.com/test?a=4&b=3&try_count=1';
$url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2';
$url4 = '/test';
function add_or_update_params($url,$key,$value){
    $a = parse_url($url);
    $query = $a['query'] ? $a['query'] : '';
    parse_str($query,$params);
    $params[$key] = $value;
    $query = http_build_query($params);
    $result = '';
    if($a['scheme']){
        $result .= $a['scheme'] . ':';
    }
    if($a['host']){
        $result .= '//' . $a['host'];
    }
    if($a['path']){
        $result .=  $a['path'];
    }
    if($query){
        $result .=  '?' . $query;
    }
    return $result;
}
echo add_or_update_params($url1,'try_count',1);
echo "\n";
echo add_or_update_params($url2,'try_count',2);
echo "\n";
echo add_or_update_params($url3,'try_count',3);
echo "\n";
echo add_or_update_params($url4,'try_count',4);
echo "\n";

4
মহান কাজ, শুধুমাত্র লাইন প্রতিস্থাপন $query = $a['query'] ? $a['query'] : '';দ্বারা$query = isset($a['query']) ? $a['query'] : '';
emmgfx

4
 /**
 * @example addParamToUrl('/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 * @example addParamToUrl('//example.com/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 * @example addParamToUrl('https://example.com/path/to/?find=1&FILTER=Y', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 *
 * @param       $url string url
 * @param array $addParams
 *
 * @return string
 */
function addParamToUrl($url, array $addParams) {
  if (!is_array($addParams)) {
    return $url;
  }

  $info = parse_url($url);

  $query = array();

  if ($info['query']) {
    parse_str($info['query'], $query);
  }

  if (!is_array($query)) {
    $query = array();
  }

  $params = array_merge($query, $addParams);

  $result = '';

  if ($info['scheme']) {
    $result .= $info['scheme'] . ':';
  }

  if ($info['host']) {
    $result .= '//' . $info['host'];
  }

  if ($info['path']) {
    $result .= $info['path'];
  }

  if ($params) {
    $result .= '?' . http_build_query($params);
  }

  return $result;
}


3

আমার মনে হয় আপনার এ জাতীয় কিছু করা উচিত।

class myURL {
    protected $baseURL, $requestParameters;

    public function __construct ($newURL) {
        $this->baseurl = $newURL;
        $this->requestParameters = array();
    }

    public function addParameter ($parameter) {
        $this->requestParameters[] = $parameter;
    }

    public function __toString () {
        return $this->baseurl.
               ( count($this->requestParameters) ?
                 '?'.implode('&', $this->requestParameters) :
                 ''
                 );
    }
}

$url1 = new myURL ('http://www.acme.com');
$url2 = new myURL ('http://www.acme.com');
$url2->addParameter('sort=popular');
$url2->addParameter('category=action');
$url1->addParameter('category=action');

echo $url1."\n".$url2;

1

এই বিষয়টিতে অনেক সংস্থান / উত্তর অনুসন্ধান করার পরে, আমি নিজের কোড করার সিদ্ধান্ত নিয়েছি। এখানে @ টেলরঅটওয়েলের উত্তরের ভিত্তিতে, আমি এভাবেই আগত $ _GET অনুরোধটি প্রক্রিয়াকরণ করি এবং প্রতিটি উপাদানকে সংশোধন / হেরফের করি।

ইউআরএলটি ধরে নিলে: http://domain.com/category/page.php?a=b&x=y এবং আমি বাছাইয়ের জন্য কেবল একটি পরামিতি চাই: হয়? Desc = কলাম_নাম বা? এসিসি = কলাম_নাম। এইভাবে, একসাথে ইউআরএল প্যারামিটার বাছাই এবং এক সাথে অর্ডার করার জন্য যথেষ্ট। সুতরাং URL টি হবে সম্পর্কিত টেবিল শিরোলেখের সারিটির প্রথম ক্লিকের http://domain.com/category/page.php?a=b&x=y&desc=column_name

তারপরে আমার কাছে টেবিল সারি শিরোনাম রয়েছে যা আমি আমার প্রথম ক্লিকে ডিইএসসি এবং একই শিরোনামের দ্বিতীয় ক্লিকে এএসসি বাছাই করতে চাই। (প্রতিটি প্রথম ক্লিক "অর্ডার বাই কলাম DESC" এর আগে হওয়া উচিত) এবং যদি কোনও বাছাই না হয়, এটি ডিফল্ট অনুসারে "তারিখ তারপর আইডি" অনুসারে বাছাই করবে।

আপনি এটিকে আরও উন্নত করতে পারেন, যেমন আপনি প্রতিটি G _GET উপাদানগুলিতে পরিষ্কার / ফিল্টারিং ফাংশন যুক্ত করতে পারেন তবে নীচের কাঠামোটি ভিত্তি স্থাপন করে la

foreach ($_GET AS $KEY => $VALUE){
    if ($KEY == 'desc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE DESC";
        $URL_ORDER = $URL_ORDER . "&asc=$VALUE";
    } elseif ($KEY == 'asc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE ASC";
        $URL_ORDER = $URL_ORDER . "&desc=$VALUE";
    } else {
        $URL_ORDER .= "&$KEY=$VALUE";
        $URL .= "&$KEY=$VALUE";
    }
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}

(আপনি http://domain.com দিয়ে শুরু করে পুরো ইউআরএলের জন্য $ _SERVER [SQLT_URI] ব্যবহার করতে পারেন )

তারপরে আমি মাইএসকিউএল কোয়েরিতে ফলাফল প্রাপ্ত $ অর্ডারটি উপরে পেয়েছি:

"SELECT * FROM table WHERE limiter = 'any' $ORDER";

পূর্ববর্তী বাছাই এবং URL সহ "(" অর্ডার করে) পরামিতি যুক্ত করার সাথে যদি URL টি দেখার ফাংশনটি হয়? বা ক্রম অনুসারে "&":

        function sort_order ($_SORT){
            global $SORT, $URL_ORDER, $URL;
            if ($SORT == $_SORT){
                return $URL_ORDER;
            } else {
                if (strpos($URL, '?') !== false){
                    return "$URL&desc=$_SORT";
                } else {                        
                    return "$URL?desc=$_SORT";
                }
            }
        }

অবশেষে, টেবিল সারি শিরোনামটি ফাংশনটি ব্যবহার করতে:

        echo "<th><a href='".sort_order('id')."'>ID</a></th>";

সংক্ষিপ্তসার: এটি ইউআরএল পড়বে, each _GET উপাদানগুলির প্রতিটি সংশোধন করবে এবং "এর সঠিক ব্যবহারের সঠিক ফর্মটি দিয়ে আপনার পছন্দের পরামিতিগুলি দিয়ে চূড়ান্ত URL তৈরি করবে?" এবং "&"


0
 public function addGetParamToUrl($url, $params)
{
    foreach ($params as $param) {
         if (strpos($url, "?"))
        {
            $url .= "&" .http_build_query($param); 
        }
        else
        {
            $url .= "?" .http_build_query($param); 
        }
    }
    return $url;
}

0

অন্য উন্নত ফাংশন সংস্করণ। ছোট উন্নতি (পোর্ট সমর্থন) এবং বাগফিক্স (সঠিকভাবে কীগুলি পরীক্ষা করা) সাথে বিদ্যমান উত্তরগুলির মিশ্রণ।

/**
 * @param string $url original url to modify - can be relative, partial etc
 * @param array $paramsOverride associative array, can be empty
 * @return string modified url
 */
protected function overrideUrlQueryParams($url, $paramsOverride){
    if (!is_array($paramsOverride)){
        return $url;
    }

    $url_parts = parse_url($url);

    if (isset($url_parts['query'])) {
        parse_str($url_parts['query'], $params);
    } else {
        $params = [];
    }

    $params = array_merge($params, $paramsOverride);

    $res = '';

    if(isset($url_parts['scheme'])) {
        $res .= $url_parts['scheme'] . ':';
    }

    if(isset($url_parts['host'])) {
        $res .= '//' . $url_parts['host'];
    }

    if(isset($url_parts['port'])) {
        $res .= ':' . $url_parts['port'];
    }

    if (isset($url_parts['path'])) {
        $res .= $url_parts['path'];
    }

    if (count($params) > 0) {
        $res .= '?' . http_build_query($params);
    }

    return $res;
}

0

ইউআরএল পরামিতি যুক্ত করতে এই ফাংশনটি ব্যবহার করে দেখুন ।

তারপরে প্যারামিটার সেট হওয়ার পরে আপনি লিঙ্কটি অক্ষম করতে পারেন যাতে কোনও url প্যারামিটারের সদৃশ থাকে না।

<?php
  function addQueryString($a)
                {
             if (empty($_SERVER['QUERY_STRING']))
               return '?' . $a;
             else if (!empty($_SERVER['QUERY_STRING']))
              return '?' . $_SERVER['QUERY_STRING'] . '&' . $a;
                }
?>

 <a href="<?php echo addQueryString('lang=en'); ?>">test</a>
 <a href="<?php echo addQueryString('category=5'); ?>">sat</a>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.