В настоящее время я создаю новый онлайн-ридер чтения на 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
Я бы понюхал для различных уникальных идентификаторов, которые имеют такие форматы:
Atom: Источник
<?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">
и т. д. (см. ссылку второго источника для полного обзора).
Насколько я вижу, разделение Atom и RSS должно быть довольно простым, ища теги <feed>
и <rss>
, соответственно. Кроме того, вы не найдете их в действительном HTML-документе.
Вы можете сделать начальную проверку, чтобы сообщить HTML и добавить файлы, сначала просматривая элементы <html>
и <body>
. Чтобы избежать проблем с недопустимым вводом, это может быть случай, когда использование регулярных выражений (над парсером) окончательно оправдано за один раз 🙂
Если он не соответствует тесту HTML, запустите на нем тесты Atom / RSS. Если он не распознается как фид или парсер XML не работает с недопустимым вводом, снова возвращайтесь в HTML.
что это похоже на дикую природу – независимо от того, являются ли поставщики корма всегда соответствующими этим правилам, – это другой вопрос, но вы уже должны быть в состоянии распознать многое таким образом.
Я думаю, что ваш лучший выбор – это заголовок Content-Type
как я предполагаю, что это делает firefox (или любой другой браузер). Кроме того, если вы думаете об этом, 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 } ?>
Почему бы не попытаться проанализировать данные с помощью компонента, созданного специально для анализа RSS / ATOM- Zend_Feed_Reader
, например Zend_Feed_Reader
?
При этом, если синтаксический анализ завершится успешно, вы будете уверены, что используемый вами URL действительно является корректным фидом RSS / ATOM.
И я должен добавить, что вы могли бы использовать такой компонент для синтаксического анализа фидов, чтобы также извлечь их информацию: не нужно заново изобретать колесо, разбирать XML « вручную » и самостоятельно решать особые случаи.
Перец,
Используйте заголовок ответа HTTP Content-Type для отправки в правый обработчик.
январь