linto cheeran
linto cheeran

Reputation: 1472

How to encode only queryparams in a url string?

I want to encode only queryparams in a url string using php, url string given below

https://torrentz-proxy.com/search?q=linux format 2015 added<6m leech>1 seed>1#12345

urlencode() gives https%3A%2F%2Ftorrentz-proxy.com%2Fsearch%3Fq%3Dlinux+format+2015+added%3C6m+leech%3E1+seed%3E1

actually I need https://torrentz-proxy.com/search?q=linux%20format%202015%20added%3C6m%20leech%3E1%20seed%3E1#12345

How to do this ? Is there any native php function to do this ?

EDIT

URL is auto generated (not by me), sample like

http://example.com/abc?a=1 a&b=2 b&c=3+c#123

Upvotes: 3

Views: 3793

Answers (4)

4givN
4givN

Reputation: 3234

The simplest way would be to :

  • get the base url with explode
  • encode only the query string (decode first to make sure to not encode twice)
  • make sure to replace # with %23
$myUrl = 'https://torrentz-proxy.com/search?q=linux format 2015 added<6m leech>1 seed>1#12345';
$finalUrl = explode("?", $myUrl)[0] . "?" . urlencode(urldecode(parse_url(str_replace('#', '%23', $myUrl), PHP_URL_QUERY)))

This is giving a full encoded query string "https://torrentz-proxy.com/search?q%3Dlinux+format+2015+added%3C6m+leech%3E1+seed%3E1%2312345"

Then replace %23 with # again if you like (as requested from the your question)

$finalUrl = str_replace('%23', '#', $finalUrl);

Upvotes: 0

SG_
SG_

Reputation: 1336

This would do

    function encodeURI($url) {
    // http://php.net/manual/en/function.rawurlencode.php
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI
    $unescaped = array(
        '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',
        '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')'
    );
    $reserved = array(
        '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':',
        '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$'
    );
    $score = array(
        '%23'=>'#'
    );
    return strtr(rawurlencode($url), array_merge($reserved,$unescaped,$score));

   }

I found this here as an alternative to encodeURI() of JS.

Upvotes: 1

gre_gor
gre_gor

Reputation: 6805

You need to parse the URL, extract the query param values, encode them and build the URL back together.

function query_param_encode($url)
{
    $url = parse_url($url);
    $url_str = "";
    if (isset($url['scheme']))
        $url_str .= $url['scheme'].'://';
    if (isset($url['host']))
        $url_str .= $url['host'];
    if (isset($url['path']))
        $url_str .= $url['path'];
    if (isset($url['query']))
    {
        $query = explode('&', $url['query']);
        foreach ($query as $j=>$value)
        {
            $value = explode('=', $value, 2);
            if (count($value) == 2)
                $query[$j] = urlencode($value[0]).'='.urlencode($value[1]);
            else
                $query[$j] = urlencode($value[0]);
        }
        $url_str .= '?'.implode('&', $query);
    }
    if (isset($url['fragment']))
        $url_str .= '#'.$url['fragment'];

    return $url_str;
}

This encodes your URLs as

https://torrentz-proxy.com/search?q=linux+format+2015+added%3C6m+leech%3E1+seed%3E1#12345
http://example.com/abc?a=1+a&b=2+b&c=3%2Bc#123

Upvotes: 3

meysam
meysam

Reputation: 1794

Use something like this:

<?php

$url = 'https://torrentz-proxy.com/search?q=linux format 2015 added<6m leech>1 seed>1#12345';

$questPos = strpos($url, '?q');
$query = explode('#', substr($url, $questPos+3));
$encodedUrl = substr($url, 0, $questPos+3) . urlencode($query[0]);

foreach (array_slice($query, 1) as $frag) {
    $encodedUrl .= '#' . $frag;
}

var_dump($encodedUrl);

that will output: string(89) "https://torrentz-proxy.com/search?q=linux+format+2015+added%3C6m+leech%3E1+seed%3E1#12345"

Upvotes: 0

Related Questions