PHP:如何在不对URL中的Scheme和Host进行编码的情况下转义url参数和路径?

时间:2014-02-04 19:03:02

标签: php url-encoding

PHP:如何在不对URL中的Scheme和Host进行编码的情况下转义URL参数和路径:

请注意*此网址只是一个示例,params的名称可能与q不同,而某些网址可能包含其他网址可能没有的路径,如下例所示。

我得到的网址如下:

http%3A%2F%2Fgoogle.com%2F?q=My%20Search%20Keyword

然后我应该转换成以下内容:

http://google.com/?q=My%20Search%20Keyword

http://google.com/?q=My Search Keyword

除了

之外,还有一种简单的方法可以做到这一点
  1. Url通过“rawurldecode”
  2. 解码整个网址
  3. “parse_url”将其拆分为方案,域,路径,查询
  4. 使用parse_str解析查询并仅转义值。
  5. 重建查询字符串
  6. 重新建立网址,
  7. 上述所有步骤也需要检查空值。
  8. 更新

    在更复杂的情况下,我得到这样的URL:

    http://www.someUrl.com/?redirect=http%3A%2F%2Fgoogle.com%2F%3Fq%3DMy%20Search%20Keyword%26hl%3Den
    

    我搜索= http .....然后我使用此部分通过Curl抓取它并从此url获取http响应代码,问题是我无法轻松准备发送ecnoded的网址从一开始就没有涉及我上面提到的复杂过程。

    有更简单的方法吗?

3 个答案:

答案 0 :(得分:1)

你不能在?爆炸,然后rawurldecode第一部分爆炸,然后崩溃吗?

$url = "http%3A%2F%2Fgoogle.com%2F?q=My%20Search%20Keyword";
$parts = explode("?", $url);
$parts[0] = rawurldecode($parts[0]);
$url = implode("?", $parts);

答案 1 :(得分:1)

试试这个:

<?php
$rawUrl = 'http%3A%2F%2Fgoogle.com%2F?q=My%20Search%20Keyword';
$arrDec = parse_url(urldecode($rawUrl)); 
$queryEnc = parse_url($rawUrl, PHP_URL_QUERY);

$newUrl = $arrDec['scheme'] . '://' . $arrDec['host'] . '?' . $queryEnc;

print_r($newUrl);

?>

这是一个phpFiddle:http://phpfiddle.org/main/code/wmi-xet

答案 2 :(得分:0)

我想出了以下解决方案,它可能有缺陷,但也可以帮助别人......

$url = rawurldecode('http%3A%2F%2Fgoogle.com%2F%3Fq%3DMy%20Search%20Keyword%26hl%3Den');
echo preg_replace_callback('#[^/\.\:&=\?]{1}#',
    function($str) { return rawurlencode($str[0]);}, 
    $url
);