Как определить, является ли страница каналом RSS или ATOM
В настоящее время я создаю новый онлайн-ридер на PHP. Одной из функций, над которыми я работаю, является автоматическое обнаружение каналов. Если пользователь вводит URL-адрес веб-сайта, сценарий обнаружит, что он не является фидом, и будет искать реальный URL-адрес фида, анализируя HTML-код для правильного тега.
Проблема в том, что в настоящее время я обнаруживаю, является ли 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/
4 ответа
Я бы понюхал различные уникальные идентификаторы, которые имеют эти форматы:
Атом: Источник
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
RSS 0.90: источник
<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">
и т. д. и т. д. (см. ссылку на 2-й источник для полного обзора).
Насколько я вижу, разделение Atom и RSS должно быть довольно простым, если искать <feed>
а также <rss>
теги соответственно. Кроме того, вы не найдете их в действительном HTML-документе.
Вы могли бы сделать начальную проверку, чтобы отличить HTML и каналы, ища <html>
а также <body>
элементы в первую очередь. Чтобы избежать проблем с неверным вводом, это может быть случай, когда использование регулярных выражений (через синтаксический анализатор) окончательно оправдано на этот раз:)
Если он не соответствует тесту HTML, запустите на нем тесты Atom / RSS. Если он не распознан как фид или синтаксический анализатор XML задыхается от неверного ввода, вернитесь к HTML снова.
как это выглядит в дикой природе - всегда ли поставщики кормов соответствуют этим правилам - это другой вопрос, но вы уже сможете многое узнать таким образом.
Я думаю, что ваш лучший выбор - получить Content-Type
заголовок, как я полагаю, так делает Firefox (или любой другой браузер). Кроме того, если вы думаете об этом, Content-Type
действительно, сервер сообщает пользовательским агентам, как обрабатывать содержимое ответа. Почти любой достойный HTTP-сервер отправляет правильный Content-Type
заголовок.
Тем не менее, вы можете попытаться идентифицировать rss/atom в контенте как второй вариант, если первый "проваливается"(этот критерий зависит от вас).
Дополнительным преимуществом является то, что вам нужно запрашивать только заголовок, а не весь документ, что экономит трафик, время и т. Д. Вы можете сделать это с помощью curl следующим образом:
<?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
}
?>
Почему бы не попробовать проанализировать ваши данные с помощью компонента, созданного специально для анализа RSS/ATOM Feed, например Zend_Feed_Reader
?
При этом, если разбор пройдет успешно, вы будете уверены, что используемый вами URL действительно является действительным каналом RSS / ATOM.
И я должен добавить, что вы могли бы использовать такой компонент для разбора канала, чтобы также извлечь их информацию: не нужно заново изобретать колесо, анализировать XML " вручную " и самостоятельно разбираться с особыми случаями.
Перец,
Используйте HTTP-заголовок ответа Content-Type для отправки правому обработчику.
январь