6

我有时会面临通过 curl 方法获取 url 数据的问题,特别是网站数据是其他语言,如阿拉伯语等我的 curl 函数是

function file_get_contents_curl($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $data = curl_exec($ch);
    $info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    //checking mime types
    if(strstr($info,'text/html')) {
        curl_close($ch);
        return $data;
    } else {
        return false;
    }
}

以及我如何获取数据

$html =  file_get_contents_curl($checkurl);
    $grid ='';
    if($html)
    {
        $doc = new DOMDocument();
        @$doc->loadHTML($html);
        $nodes = $doc->getElementsByTagName('title');
        @$title = $nodes->item(0)->nodeValue;
        @$metas = $doc->getElementsByTagName('meta');
        for ($i = 0; $i < $metas->length; $i++)
        {
            $meta = $metas->item($i);
            if($meta->getAttribute('name') == 'description')
                $description = $meta->getAttribute('content');
        }

我从一些阿拉伯网站(如 http://www.emaratalyoum.com/multimedia/videos/2012-04-08-1.474873 以及当我给这个 youtube 网址 http://www.youtube.com/watch时)正确获取所有数据?v=Eyxljw31TtU&feature=g-logo&context=G2c4f841FOAAAAAAAFAA
它显示符号.. 我必须做什么设置才能显示完全相同的标题描述。

4

3 回答 3

6

介绍

学习阿拉伯语可能非常棘手,但它们是您需要确保的一些基本步骤

  • 您的文件必须输出UTF-8
  • 您的 DOMDocument 必须以 UTF-8 fromat 格式读取

问题

获取 Youtube 信息时,它已经给出了“UTF-8”格式的信息,并且检索过程添加了附加UTF-8编码....不知道为什么会发生这种情况,但一个简单的utf8_decode方法可以解决这个问题

例子

header('Content-Type: text/html; charset=UTF-8');
echo displayMeta("http://www.emaratalyoum.com/multimedia/videos/2012-04-08-1.474873");
echo displayMeta("http://www.youtube.com/watch?v=Eyxljw31TtU&feature=g-logo&context=G2c4f841FOAAAAAAAFAA"); 

输出

emaratalyoum.com

التقطت عدسات الكاميرا حارس مرمى ريال مدريد إيكر كاسياس في موقف محرج قبل لحظات من بداية مباراة النادي الملكي مع أبويل القبرصي في ذهاب دور الثمانية لدوري أبطال 

youtube.com

أوروبا.ففي النفق المؤدي إلى الملعب، قام كاسياس بوضع إصبعه في أنفه، وبعدها قام بمسح يده في وجه أحدبنات سعوديات: أريد "شايب يدللني ولا شاب يعللني"

使用的功能

显示元

function displayMeta($checkurl) {
    $html = file_get_contents_curl($checkurl);
    $grid = '';
    if ($html) {
        $doc = new DOMDocument("1.0","UTF-8");
        @$doc->loadHTML($html);
        $nodes = $doc->getElementsByTagName('title');
        $title = $nodes->item(0)->nodeValue;
        $metas = $doc->getElementsByTagName('meta');
        for($i = 0; $i < $metas->length; $i ++) {
            $meta = $metas->item($i);
            if ($meta->getAttribute('name') == 'description') {
                $description = $meta->getAttribute('content');
                if (stripos(parse_url($checkurl, PHP_URL_HOST), "youtube") !== false)
                    return utf8_decode($description);
                else {
                    return $description;
                }
            }
        }
    }
}

* file_get_contents_curl*

function file_get_contents_curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $data = curl_exec($ch);
    $info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

    // checking mime types
    if (strstr($info, 'text/html')) {
        curl_close($ch);
        return $data;
    } else {
        return false;
    }
}
于 2012-11-06T11:18:40.433 回答
1

我相信这会起作用...... utf8_decode() 你的属性..

function file_get_contents_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$data = curl_exec($ch);
$info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);

//checking mime types
if(strstr($info,'text/html')) {
    curl_close($ch);
    return $data;
} else {
    return false;
}
}

$html =  file_get_contents_curl($checkurl);
$grid ='';
if($html)
{
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $nodes = $doc->getElementsByTagName('title');
    @$title = $nodes->item(0)->nodeValue;
    @$metas = $doc->getElementsByTagName('meta');
    for ($i = 0; $i < $metas->length; $i++)
    {
        $meta = $metas->item($i);
        if($meta->getAttribute('name') == 'description')
            $description = utf8_decode($meta->getAttribute('content'));
    }
于 2012-11-10T23:42:06.480 回答
1

这里发生的情况是您丢弃了Content-TypecURL 在file_get_contents_curl()函数中返回的找到的标头;DOMDocument需要该信息来了解页面上使用的字符集。

一个有点丑陋但最通用的技巧是在返回的页面前面加上一个<meta>标签,该标签包含响应标头中返回的字符集:

if (strstr($info, 'text/html')) {
    curl_close($ch);
    return '<meta http-equiv="Content-Type" content="' . $info . '" />' . $data;
}

DOMDocument 将接受错误放置的元标记并自动进行相应的转换。

于 2012-11-11T07:25:53.123 回答