为什么file_get_contents返回奇怪的字符?

时间:2012-09-28 05:34:32

标签: php parsing

我正在尝试使用file_get_contents解析http://www.desi-tashan.com/category/pakistan-tvs/aaj-tv/3-idiots/

但它会返回非常不寻常的字符和符号。

就好像我解析http://www.desi-tashan.com/一样,它很有效。有人能告诉为什么会这样吗?

是否涉及编码解码?

该页面似乎是用wordpress制作的。

3 个答案:

答案 0 :(得分:7)

您看到的内容是gzipped

您可能有兴趣查看gzdecodezlib-decode (请注意,默认情况下不启用PHP中的Zlib支持)

您的代码可能如下所示

$url = 'http://www.desi-tashan.com/category/pakistan-tvs/aaj-tv/3-idiots/';
$content = file_get_contents($url);
$decoded_content = gzdecode($content); // or zlib_decode($content);

stackoverflow上的另一个解决方案here,它在请求中添加了HTTP标头Accept-Encoding,告诉服务器不要gzip。

但是,它不适用于www.desi-tashan.com,服务器忽略Accept-Encoding标头,并始终返回gzip压缩内容

答案 1 :(得分:5)

我已经看到这种情况发生在Web服务器配置错误的网站上,并发回一个压缩页面,无论客户端是否表明它可以应对。 (客户端用Accept-Encoding标题表示这一点,file_get_contents不会发送。)这通常适用于Web浏览器,因为它们要么默认压缩页面,要么处理gzipped响应,即使他们没有要求一个。

(顺便说一句,如果在unix派生系统上,你可以通过将其保存到文件然后在其上运行file来轻松确认返回的内容是gzip压缩。或者只是查看前几个字节结果你自己的gzip数据从1F 8B开始。)

我不是手动解压缩内容,而是亲自使用PHP的curl库。你可以配置它来请求内容gzip,如果你这样做,它将透明地解压缩你的结果:

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, 'http://actualidad.rt.com/actualidad');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_ENCODING , 'gzip');
$content = curl_exec ($ch);

这比手动解码结果更具有前瞻性,就好像将来正确配置Web服务器以将纯文本发送回无法处理gzip的客户端一样,此代码仍会请求和解码压缩版本。

答案 2 :(得分:-1)

您只需使用javascript charAt method即可获取特定位置的字符串字符。 要么 非常清楚,只需使用文件名输入函数,它将返回您选择的文件的扩展名。