Reputation: 1472
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
Reputation: 3234
The simplest way would be to :
#
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
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
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
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