2

私は現在、PHPで新しいオンラインフィードリーダーを構築しています。私が取り組んでいる機能の1つは、フィードの自動検出です。<link>ユーザーがWebサイトのURLを入力すると、スクリプトはそれがフィードではないことを検出し、HTMLを解析して適切なタグを取得することにより、実際のフィードURLを探します。

問題は、URLがフィードなのかウェブサイトなのかを現在検出している方法が一部しか機能しないことであり、それが最善の解決策ではないことを私は知っています。現在、CURL応答を取得して実行していsimplexml_load_stringます。解析できない場合は、Webサイトとして扱います。これがコードです。

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

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

明らかに、これは理想的ではありません。また、解析可能なHTML Webサイトに遭遇すると、フィードと見なされます。

PHPでフィードと非フィードの違いを検出するための良い方法に関する提案はありますか?

4

4 に答える 4

8

これらの形式が持つさまざまな一意の識別子をスニッフィングします。

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">

などなど(完全な概要については、2番目のソースリンクを参照してください)。

私が見る限り、AtomとRSSの分離は、それぞれ<feed><rss>タグを探すことで非常に簡単なはずです。さらに、それらは有効なHTMLドキュメントにはありません。

<html>最初に<body>要素を検索することで、HTMLとフィードを区別するための初期チェックを行うことができます。無効な入力の問題を回避するために、これは(パーサー上で)正規表現を使用することが最終的に1回だけ正当化される場合です:)

HTMLテストと一致しない場合は、Atom/RSSテストを実行してください。フィードとして認識されない場合、またはXMLパーサーが無効な入力でチョークする場合は、HTMLに再度フォールバックします。

フィードプロバイダーが常にこれらのルールに準拠しているかどうかという、実際の状況は別の質問ですが、この方法ですでに多くのことを認識できるはずです。

于 2010-03-14T17:18:00.957 に答える
3

Content-TypeFirefox(または他のブラウザ)が行う方法であると私が思うので、あなたの最良の選択はヘッダーを取得することだと思います。その上、あなたがそれについて考えるならば、それContent-Typeは確かにサーバーがユーザーエージェントに応答コンテンツを処理する方法を教える方法です。ほとんどすべてのまともなHTTPサーバーは正しいContent-Typeヘッダーを送信します。

それでも、最初のものが「失敗」した場合は、コンテンツ内のrss / atomを2番目の選択肢として識別しようとすることができます(この基準はあなた次第です)。

追加の利点は、ドキュメント全体ではなくヘッダーを要求するだけでよいため、帯域幅や時間などを節約できることです。これは、次のように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
 }
?>
于 2012-12-12T22:35:07.893 に答える
2

RSS / ATOMフィードを解析するために特別に構築されたコンポーネントを使用してデータを解析してみませんZend_Feed_Readerか?

これにより、解析が成功した場合、使用したURLが実際に有効なRSS/ATOMフィードであることがかなり確実になります。


また、そのようなコンポーネントを使用してフィードを解析し、情報を抽出することもできます。車輪を再発明したり、XMLを「手作業で」解析したり、特殊なケースを自分で処理したりする必要はありません。

于 2010-03-14T17:16:18.190 に答える
0

Content-Type HTTP応答ヘッダーを使用して、適切なハンドラーにディスパッチします。

于 2010-03-14T18:24:18.177 に答える