【问题标题】:php encode full url with spaces in argumentsphp用参数中的空格编码完整的url
【发布时间】:2021-07-07 06:39:46
【问题描述】:

我有一个类似的网址

http://example.com/index.php?id=111&title=word1 word2 word3

在使用 curl 请求 url 之前,我需要对空格进行编码。

但是如何对 url 的正确部分进行 urlencode。

urlencoderawurlencodehttps 的斜线、问号等进行编码。

【问题讨论】:

  • 使用 parse_url 将 URL 分解为其组成部分,然后根据需要对查询字符串进行操作。使用 http_build_url 重新拼接在一起。

标签: php urlencode


【解决方案1】:

您可以使用parse_url() 将 URL 拆分为各个部分。在parse_url 返回的数组中的query 元素上使用urlencode(),然后使用http_build_url 将其重新组合在一起。

注意:http_build_url 需要 PECL pecl_http >= 0.21.0

【讨论】:

  • 进一步使用 parse_str 和 http_build_query 也值得一提。
  • 查询已经部分编码,再次编码会不会导致现有的&和=被错误替换?
  • parse_url 将查询参数作为字符串返回 id=111&title=word1 word2 word3 如果我对该字符串进行 urlencode,我会遇到同样的问题。 &= 将被编码..
  • 如果空格是 only 问题(即 word1 word2 等 不能 包含任何标点符号)肯定是整个事情的简单正则表达式用 + 替换空格就可以了。
  • 您不会走得太远尝试制作一个防弹函数来转换可能已经或可能尚未正确/完全编码的未知查询字符串。你会得到一个最好的猜测函数,这就是你得到的全部。
【解决方案2】:

用“+”替换空格。

【讨论】:

    【解决方案3】:

    正如@F21 所说,...

    function fixUrlEncoding(string $url){
    
        $scheme = parse_url($url, PHP_URL_SCHEME);
        $host   = parse_url($url, PHP_URL_HOST);
        $path   = parse_url($url, PHP_URL_PATH);
        $query  = parse_url($url, PHP_URL_QUERY);
    
        $f = explode('?', $query,2);
        $file  = $f[0];
        $query = $f[1];
    
        $ini   = $scheme . '://' . $host . $path ;
    
        // fix encoding
        parse_str($query, $result);
        foreach ($result as $k => $val){
            $result[$k] = urlencode($val);
        }
    
        $query = $file . '?' . http_build_query($result);
    
        if (!Strings::startsWith('http', $url)){
            $url = $ini . '?' . $query;
        } else {
            $url = substr($url, strlen($ini)) . '?' . $query;
            $url = $ini . '?' . $query;
        }
    
        return $url;
    }
    

    【讨论】:

    • 从 PHP 8 开始,Strings::startsWith('http',$url) 可以替换为 str_starts_with($url,'http') 或 substr($url,0,4)== 'http' 适用于使用旧版本 PHP 且没有“字符串”的用户
    • 另外,"$url = $ini . '?' 的第二个实例.$查询;"我认为应该删除...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2011-07-31
    • 1970-01-01
    • 2011-07-02
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多