1

解决方案 因为objective-c 不编码&(因为它是保留的),所以您应该创建自己的方法。资料来源:使用带有 Obj-C 的帖子发送放大器 (&)

对于我的 iOS 和 Android 应用程序,我使用 php 脚本来获取一些数据。该脚本有 1 个参数,它是一个链接。基本上该脚本如下所示:

$link= urlVariable('link'); 
$source = file_get_contents($link);

$xml = new SimpleXMLElement($source);

//Do stuff with the xml

但是当我发送带有 & 符号的链接时,它会在 file_get_contents 上崩溃

Warning: file_get_contents(https://www.example.com/xxxx/name_more_names_) [function.file-get-contents]: failed to open stream: HTTP request failed!

但完整的论点是

name_more_names_&_more_names_after_the_ampersand.file

我尝试在将链接发送到 file_get_contents 之前对其进行编码,但没有成功。

也试过:

function file_get_contents_utf8($fn) {
     $content = file_get_contents($fn);
      return mb_convert_encoding($content, 'UTF-8',
          mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}

结果相同。

有人知道为什么它会在&处中断吗?我不是网络开发人员,而是应用程序开发人员,所以请原谅我缺乏这方面的知识。

编辑 也试过这个:

$link= urlVariable('link'); 
$encodedLink = urlencode($link);
$source = file_get_contents($encodedLink);

这是结果:

Warning: file_get_contents(https%3A%2F%2Fwww.example.com%2Fxxxxx%2Fname_more_names_) [function.file-get-contents]: failed to open stream: No such file or directory in

编辑#2

我找到了为什么我的网址在 & 符号处停止。我用这个方法从 url 中检索我的论点:

    function  urlVariable($pVariableName)
    {
        if (isset ($_GET[$pVariableName]))   
        {
            $lVariable = $_GET[$pVariableName];
        }
        else
        {
            $lVariable = null;
        }
        return $lVariable;
    }

_GET() 用 & 符号分隔参数对吗?

4

2 回答 2

3

URL 的 & 符号应该正确编码:

https://www.example.com/xxxx/name_more_names_%26_more_names_after_the_ampersand.file

在 PHP 中,您可以像这样对路径进行编码:

$path = parse_url($url, PHP_URL_PATH);
$url = substr_replace($url, '/' . urlencode(substr($path, 1)), strpos($url, $path), strlen($path));

更新

如果你还有一个树结构,你需要做更多的工作:

$path = parse_url($url, PHP_URL_PATH);
$newpath = '/' . str_replace('%2F', '/', urlencode(substr($path, 1)));

$url = substr_replace($url, $newpath, strpos($url, $path), strlen($path));

更新 2

如果您的脚本被称为 like script?link=<some-url>,您需要确保<some-url>也正确编码:

script?link=https%3A%2F%2Fwww.example.com%2Fxxxxx%2Fname_more_names_%26_more_names_after_the_ampersand.file
于 2013-04-05T08:33:13.547 回答
0

采用

$url = urlencode($url);
$data = file_get_contents($url);
于 2016-09-05T12:11:37.567 回答