كيفية اكتشاف ما إذا كانت الصفحة هي تغذية RSS أو Atom

StackOverflow https://stackoverflow.com/questions/2442984

  •  19-09-2019
  •  | 
  •  

سؤال

أنا حاليا بناء قارئ جديد عبر الإنترنت في PHP. واحدة من الميزات التي أعملها هي إطعام اكتشاف السيارات. إذا دخل المستخدم عنوان URL لموقع الويب، فسوف يكتشف البرنامج النصي أنه ليس إطعام وابحث عن عنوان URL للعديد الحقيقي عن طريق تحليل HTML للعلامة الصحيحة.

المشكلة هي أن الطريقة التي اكتشفها حاليا إذا كانت عنوان URL موجز أو موقع ويب يعمل فقط جزءا من الوقت، وأنا أعلم أنه لا يمكن أن يكون أفضل حل. الآن ايم أخذ استجابة حليقة وإدارةها من خلال 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.

هل كانت مفيدة؟

المحلول

كنت أشمها من أجل مختلف المعرفات الفريدة تلك التنسيقات لديها:

ذرة: مصدر

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

إلخ. (انظر الرابط المصدر الثاني لمحة عامة كاملة).

بقدر ما أستطيع أن أرى، يجب أن يكون فصل الذرة و RSS سهلة للغاية من خلال البحث عن <feed> و <rss> العلامات، على التوالي. بالإضافة إلى أنك لن تجد تلك الموجودة في مستند HTML صالح.

يمكنك إجراء فحص أولي لإخبار HTML ويغذي عن طريق البحث عنه <html> و <body> العناصر أولا. لتجنب مشاكل إدخال غير صالح، قد يكون هذا حالة حيث يتم تبرير استخدام تعبيرات منتظمة (عبر محلل) أخيرا لمرة واحدة :)

إذا لم يطابق اختبار HTML، فقم بتشغيل اختبارات Atom / RSS عليها. إذا لم يتم التعرف عليه كغذاء، أو يخنق محلل XML على إدخال غير صالح، فتراجع إلى HTML مرة أخرى.

ما يبدو أنه يبدو وكأنه في البرية - ما إذا كان مزودي الأعلاف يتوافقون دائما مع هذه القواعد - هو سؤال مختلف، ولكن يجب أن تكون قادرا بالفعل على التعرف على الكثير بهذه الطريقة.

نصائح أخرى

أعتقد أن خيارك الأفضل هو الحصول على 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
 }
?>

لماذا لا تحاول تحليل بياناتك مع مكون مكون خصيصا لتحليل تغذية RSS / Atom، مثل Zend_Feed_Reader ?

مع ذلك، إذا نجح التحليل، فستكون متأكدا من أن عنوان URL الذي استخدمته هو بالفعل تغذية RSS / Atom صالحة.


ويجب أن أضيف أنه يمكنك استخدام هذا المكون لتحليل الأعلاف من أجل استخراج معلوماتها أيضا: لا حاجة لإعادة اختراع العجلة، وتحليل XML "باليد"، والتعامل مع الحالات الخاصة بنفسك.

الفلفل،

استخدم رأس استجابة HTTP من نوع المحتوى لإرساله إلى المعالج الصحيح.

في يناير

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top