2015-12-13 4 views
2

Я хочу, чтобы закодировать в строке URL-адрес только queryparams с помощью PHP, URL строки приведены нижеКак закодировать только queryparams в строке url?

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

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

на самом деле мне нужно https://torrentz-proxy.com/search?q=linux%20format%202015%20added%3C6m%20leech%3E1%20seed%3E1#12345

Как это сделать? Есть ли встроенная функция php для этого?

EDIT

URL является автогенерируемая (не мной), образец, как

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

Просто подстройте его после? и кодировать его – Mihai

+0

@Mihai, то # (фрагмент) будет потерять? –

+0

Разве вы не можете просто кодировать значение параметра запроса? '" https://torrentz-proxy.com/search?q=".urlencode("linux format 2015 добавлено <6m leech> 1 seed> 1 # 12345 ")' –

ответ

1

Это сделает

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

    } 

Я нашел этот here в качестве альтернативы encodeURI() из JS.

0

использовать что-то вроде этого:

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

, выводящий: string(89) "https://torrentz-proxy.com/search?q=linux+format+2015+added%3C6m+leech%3E1+seed%3E1#12345"

+0

# 12345 фрагмент отсутствует –

+0

если есть несколько запросовпарамов? like (q =) –

+0

Проверить новое издание plz. Вы можете использовать explode, как и для кода, для более чем одного '? Q'. – meysam

0

Вам нужно проанализировать URL-адрес, извлечь значения параметров запроса, закодировать их и собрать URL-адрес вместе.

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

Это кодирует URL-адреса в качестве

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