RSS-канал с изображениями с помощью PHP - PullRequest
0 голосов
/ 29 декабря 2011

Я пытаюсь пропустить RSS-канал для следующего RSS-канала. http://menmedia.co.uk/manchestereveningnews/news/rss.xml

Я могу без проблем справиться с этим методом:

<?
$xml = file_get_contents('http://menmedia.co.uk/manchestereveningnews/news/rss.xml');

// Use cURL to get the RSS feed into a PHP string variable.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,
        'http://menmedia.co.uk/manchestereveningnews/news/rss.xml');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($ch);
curl_close($ch);

// Include the handy XML data extraction functions.
include 'xml_regex.php';
// An RSS 2.0 feed must have a channel title, and it will
// come before the news items. So it's safe to grab the
// first title element and assume that it's the channel
// title.
$channel_title = value_in('title', $xml);
// An RSS 2.0 feed must also have a link element that
// points to the site that the feed came from.
$channel_link = value_in('link', $xml);

// Create an array of item elements from the XML feed.
$news_items = element_set('item', $xml);

foreach($news_items as $item) {
    $title = value_in('title', $item);
    $url = value_in('link', $item);
    $description = value_in('description', $item);
    $timestamp = strtotime(value_in('pubDate', $item));
    $item_array[] = array(
            'title' => $title,
            'url' => $url,
            'description' => $description,
            'timestamp' => $timestamp
    );
}

if (sizeof($item_array) > 0) {
    // First create a div element as a container for the whole
    // thing. This makes CSS styling easier.
    $html = '';
    // Markup the title of the channel as a hyperlink.
    $html .= '';
    // Now iterate through the data array, building HTML for
    // each news item.
    $count = 0;
    echo "";
    foreach ($item_array as $item) {
         $html .= '<a href="'.make_safe($item['url']).'" target="_blank">
    <img src="'.$item['enclosure'].'">
    '.substr("".$item['title']."", 0, 80).' 

    </div></a>';



        echo '';
        // Limit the output to five news items.
        if (++$count == 1) {
            break;
        }

    }
    $html .= '';
    echo $html;
}

function make_safe($string) {
    $string = preg_replace('#<!\[CDATA\[.*?\]\]>#s', '', $string);
    $string = strip_tags($string);
    // The next line requires PHP 5, unfortunately.
    //$string = htmlentities($string, ENT_NOQUOTES, 'UTF-8', false);
    // Instead, use this set of replacements in PHP 4.
    $string = str_replace('<', '&lt;', $string);
    $string = str_replace('>', '&gt;', $string);
    $string = str_replace('(', '&#40;', $string);
    $string = str_replace(')', '&#41;', $string);
    return $string;
}


?>

Тем не менее, я пытаюсь получить изображения, которые также проходят через тег вложений на RSS-канале.

В ту минуту, когда я использую:

<img src="'.$item['enclosure'].'">

Это не работает.

Любые идеи будут по достоинству оценены!

спасибо

1 Ответ

1 голос
/ 29 декабря 2011

Насколько я понимаю, корпус представляет собой открытый-закрытый тег, состоящий только из атрибутов.

<enclosure length="1280" url="http://m.gmgrd.co.uk/res/108.$plit/C_71_article_1469226_short_teaser_group_short_teaser_image.jpg" type="image/jpeg" />

Это означает, что вы не можете просто получить доступ к его значениям, как вы делаете с guid или title, но вы должны получить доступ к атрибутам .

В настоящее время вы даже не устанавливаете индекс, к которому пытаетесь обратиться позже:

$item_array[] = array(
    'title' => $title,
    'url' => $url,
    'description' => $description,
    'timestamp' => $timestamp
    // Here enclosure is missing
);

Я не знаю ваш класс XML, но вам нужно выяснить, можете ли вы каким-либо образом получить доступ к атрибутам элемента после использования element_set. Или, если есть другой метод для доступа к атрибутам.

Как только вы узнаете URL-адрес, вы можете извлечь изображение из этого URL-адреса и создать копию на своем собственном сервере. Однако оба варианта вызывают разные проблемы:

  1. Если вы создадите собственную копию на своем сервере, вы можете нарушить авторские права
  2. Если вы даете ссылки на URL-адрес, который нарушаете в отношении здравого смысла при разработке HTML, поскольку дип-линки к изображениям воспринимаются как зло (возможно, отображение изображения на вашем сайте также противоречит авторскому праву, я не знаю там международного права)

В зависимости от того, по какому пути вы пойдете, вы либо просто позвоните

// $attribute is the url-attribute of the enclosure-tag
<img src="'.$attribute.'">

или скопируйте изображение на свой сервер и затем наберите

<img src="'.$urlToImageOnYourServer.'">

Если вы используете функции из bobulous.org.uk и уже включают part 3 , вы можете отредактировать ваш цикл foreach следующим образом, чтобы получить URL-адрес вложения:

foreach($news_items as $item) {
    $title = value_in('title', $item);
    $url = value_in('link', $item);
    $description = value_in('description', $item);
    $timestamp = strtotime(value_in('pubDate', $item));
    $imageAttrs = attributes_in('enclosure', $item));
    $imageUrl = $imageAttrs['url'];
    $item_array[] = array(
        'title' => $title,
        'url' => $url,
        'description' => $description,
        'timestamp' => $timestamp,
        'enclosure' => $imageUrl,
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...