file_get_contents()失败,网址为

时间:2015-06-28 08:48:29

标签: php file-get-contents

我需要获取一些包含瑞典字母表中某些字符的URL。

如果您将此类字符串作为https://en.wikipedia.org/wiki/Åland_Islands的示例,将其作为参数直接传递到file_get_contents调用就可以了。但是,如果您首先通过urlencode运行该URL,则调用将失败,并显示以下消息:

  

无法打开流:没有此类文件或目录

尽管有file_get_contents的文档说:

  

注意:如果要打开带有特殊字符的URI,例如空格,   你需要用urlencode()编码URI。

例如,如果您运行以下代码:

error_reporting(E_ALL);
ini_set("display_errors", true);

$url = urlencode("https://en.wikipedia.org/wiki/Åland_Islands");

$response = file_get_contents($url);
if($response === false) {
    die('file get contents has failed');
}
echo $response;

您将收到错误消息。如果您只是从代码中删除“urlencode”,它将运行正常。

我面临的问题是我的网址中有一个参数来自提交的表单。由于PHP始终通过urlencode运行提交的值,因此构造的URL中的瑞典字符将导致错误发生。

我如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

问题可能是由于urlencode逃避了你的协议:

https://en.wikipedia.org/wiki/Åland_Islands
https%3A%2F%2Fen.wikipedia.org%2Fwiki%2F%C3%85land_Islands

这是我也遇到过的一个问题,只能通过尝试将转义目标定位到逃生所需的内容来解决:

https://en.wikipedia.org/wiki/Åland_Islands
https://en.wikipedia.org/wiki/%C3%85land_Islands    

根据角色所在的位置,可以想象这很棘手。我通常选择编码补丁解决方案,但我曾与之合作的人更喜欢只对其网址的动态段进行编码。

这是我的方法:

https://en.wikipedia.org/wiki/Åland_Islands
https%3A%2F%2Fen.wikipedia.org%2Fwiki%2F%C3%85land_Islands
https://en.wikipedia.org/wiki/%C3%85land_Islands

代码:

$url = 'https://en.wikipedia.org/wiki/Åland_Islands';
$encodedUrl = urlencode($url);
$fixedEncodedUrl = str_replace(['%2F', '%3A'], ['/', ':'], $encodedUrl);

希望它有所帮助。

答案 1 :(得分:0)

使用此

$usableURL = mb_convert_encoding($url,'HTML-ENTITIES');