1

我有一个如下形式的网址

http://www.site.com/index.php?q=foo boo

当我通过chrome访问url时,chrome将其正确转换为

http://www.site.com/index.php?q=foo%20boo

现在,当我将 file_get_contents 与第一个 url 一起使用时,它无法正确读取 url,而当我使用以下 url 时它可以

http://www.site.com/index.php?q=foo boo

我应该使用什么 php 函数/函数来将第一个链接转换为最后一个链接,以便将第一个链接上的所有特殊字符(如空格)正确转换为 最后一个链接?

4

2 回答 2

2

您可以使用 PHP 的rawurlencode()

http://www.php.net/manual/en/function.rawurlencode.php

于 2012-07-26T18:47:41.443 回答
0

 比用HTML 实体替换可破坏空格更安全的选择是用\xA0ASCII 字符替换它。他们实际上是平等的。an 中的&字符URL被视为参数分隔符,因此 只会导致问题。以下算法可以做你可能正在寻找的东西:

$url = 'http://www.site.com/index.php?q=foo boo&r=fii bii';
echo str_replace("\x20", "\xA0", $url);
// result: http://www.site.com/index.php?q=foo boo&r=fii bii (spaces are non-breakable)
echo str_replace("\x20", " ", $url);
// result: http://www.site.com/index.php?q=foo boo&r=fii bii

更复杂的算法:

echo preg_replace_callback('/[\?&]\w+=([^&]+)/', create_function(
    '$matches',
    'return str_replace("\x20", "\xA0", $matches[0]);'
  ), $url);
// result: http://www.site.com/index.php?q=foo boo&r=fii bii (spaces are non-breakable)

当这些参数被提取出来时:

$arr = parse_url($url);
parse_str($arr['query'], $arr);
var_export($arr);
// result for \xA0  : array ( 'q' => 'foo boo', 'r' => 'fii bii', )
// result for  : array ( 'q' => 'foo', 'nbsp;boo' => '', 'r' => 'fii', 'nbsp;bii' => '', ) // triple `&` in conflict
于 2012-07-26T20:47:37.747 回答