2010-03-14 2 views
2

В настоящее время я создаю новый онлайн-ридер чтения на PHP. Одной из возможностей, над которыми я работаю, является автоматическое обнаружение фида. Если пользователь вводит URL-адрес веб-сайта, скрипт обнаруживает, что он не является фидом и ищет настоящий URL-адрес канала, анализируя HTML для правильного тега.Как определить, является ли страница RSS или фида ATOM

Проблема заключается в том, как в настоящее время обнаруживается, что URL-адрес является фидом или веб-сайт работает только часть времени, и я знаю, что это не может быть лучшим решением. Прямо сейчас я беру ответ CURL и запускаю его через simplexml_load_string, если он не может его разобрать, я рассматриваю его как веб-сайт. Вот код.

$xml = @simplexml_load_string($site_found['content']); 

if(!$xml) // this is a website, not a feed 
{ 
    // handle website 
} 
else 
{ 
    // parse feed 
} 

Очевидно, что это не идеальный вариант. Кроме того, когда он сталкивается с HTML-сайтом, который он может анализировать, он думает о своем фиде.

Любые предложения по хорошему способу определения разницы между фидом или не-фидом в PHP?

Спасибо,

Перец http://feedingo.com

ответ

8

Я бы понюхать для различных уникальных идентификаторов эти форматы имеют:

Atom: Source

<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom"> 

RSS 0,90: Source

<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns="http://my.netscape.com/rdf/simple/0.9/"> 

Netscape RSS 0,91

<rss version="0.91"> 

и т. Д. (См. Ссылку второго источника для полного обзора).

Насколько я могу видеть, разделение Atom и RSS должно быть довольно простым, ища теги и <rss> соответственно. Кроме того, вы не найдете их в действительном HTML-документе.

Вы можете сделать первоначальную проверку, чтобы сообщить HTML и добавить каналы, предварительно просмотрев <html> и <body> элементы. Чтобы избежать проблем с недопустимым вводом, это может быть случай, когда использование регулярных выражений (над парсером) в конечном счете оправдано. for once :) Если это не соответствует тесту HTML, запустите на нем тесты Atom/RSS. Если он не распознается как фид или парсер XML не работает с недопустимым вводом, снова возвращайтесь в HTML.

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

+0

Да, они должны иметь эти идентификаторы тегов. Но есть так много плохо сформированных кормов и разных версий, я не могу полагаться на это. Поиск тега или интересен. Я проверю это. – Pepper

+0

@Pepper да, возможно, скомпилировать списки тегов, чтобы нюхать? 'html' и' body' для HTML, 'rdf' и' item' (IIRC) для RSS, 'feed' для Atom .... –

2

Почему бы не попытаться разобрать ваши данные с помощью компонента, построенного специально для разбора RSS/ATOM поток, как Zend_Feed_Reader?

При этом, если синтаксический анализ завершается успешно, вы будете уверены, что используемый вами URL действительно является допустимым фидом RSS/ATOM.


И я должен добавить, что вы могли бы использовать такой компонент для разбора канала для того, чтобы извлечь их информацию, тоже: нет необходимости заново изобретать колесо, разбор XML «вручную», и дело с отдельными случаями.

+0

Использование simplexml_load_string и разборе вручную работает для меня, он обнаруживает разницу между веб-сайтом и кормом, что проблема. Спасибо, хотя;) – Pepper

+0

Что делать, если фид плохо сформирован XML? Можете ли вы разобрать все расширения для таких каналов, как теги и шкафы? Может быть, вам все равно, но мой опыт в том, что каналы не настолько стандартизированы, как вы могли бы ожидать, и использование существующей библиотеки не позволит вам изобретать колесо. –

+0

Попробуйте попробовать Zend_Feed_Reader. Я попробовал SimplePie в начале проекта, и у меня был более высокий показатель успеха, который он сам разбирал. Вы правы в том, что каналы не стандартизированы, это беспорядок. – Pepper

0

перец,

Используйте заголовок ответа HTTP Content-Type для отправки в правый обработчик.

Jan

+0

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

3

Я думаю, что ваш лучший выбор получает заголовок Content-Type, как я предполагаю, что это путь светлячок (или любой другой браузер) это делает. Кроме того, если вы думаете об этом, то Content-Type действительно является тем, как сервер сообщает агентам пользователя, как обрабатывать контент ответа. Почти любой приличный HTTP-сервер отправляет правильный заголовок Content-Type.

Тем не менее, вы можете попытаться идентифицировать rss/atom в содержании в качестве второго варианта, если первый «не удается» (этот критерий зависит от вас).

Дополнительным преимуществом является то, что вам нужно всего лишь запросить заголовок, а не весь документ, тем самым экономя ваш трафик, время и т.д. Вы можете сделать это с завитком, как это:

<?php 
$ch = curl_init("http://sample.com/feed"); 
curl_setopt($ch, CURLOPT_NOBODY, true); // this set the HTTP Request Method to HEAD instead GET(default) and the server only sends HTTP Header(no content). 
curl_exec($ch); 
$conType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 

if (is_rss($conType)){ // You need to implement is_rss($conType) function 
    // TODO 
}elseif(is_html($conType)) { // You need to implement is_html($conType) function 
    // Search a rss in html 
}else{ 
    // Error : Page has no rss/atom feed 
} 
?> 

 Смежные вопросы

  • Нет связанных вопросов^_^