Bir sayfa bir RSS veya ATOM beslemesi olup olmadığını tespit etmek için nasıl

4 Cevap php

Şu anda PHP yeni bir online Yem Reader inşa ediyorum. Ben üzerinde çalışıyorum özelliklerinden biri otomatik keşif beslemek olduğunu. Bir kullanıcı bir web sitesi URL girerse, komut dosyası tespit edecek, onun değil bir besleme ve uygun etiketi için HTML ayrıştırma gerçek besleme adresini aramak.

Sorun URL besleme ya da bir web sitesi sadece zaman parçası çalışır ve bunu en iyi çözüm olamaz biliyorum eğer şekilde im şu anda tespit vardır. Şu anda bunu ayrıştırmak değil eğer ben bir web sitesi olarak davranın, CURL tepki alıyor ve simplexml_load_string aracılığıyla çalışan im. İşte kodudur.

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

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

Açıkçası, bu ideal değildir. O ayrıştırmak ki bir HTML web sitesine içine çalıştığında da, onun bir beslemeyi düşünüyor.

PHP bir besleme veya non-yem arasındaki farkı tespit iyi bir şekilde herhangi bir öneriniz?

Teşekkürler,

Pepper http://feedingo.com

4 Cevap

Ben bu formatları var çeşitli benzersiz tanımlayıcılar için sniff olacaktır:

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

vs vs (tam bir genel bakış için 2 kaynak linke bakınız).

Bildiğim kadarıyla ben gördüğünüz gibi, Atom ve RSS ayıran sırasıyla, <feed> ve <rss> etiketleri bakarak oldukça kolay olmalıdır. Artı, geçerli bir HTML belgesi olanlar bulamazsınız.

Sen bir başlangıç ​​kontrolü ilk <html> ve <body> elemanları bakarak ayrı HTML ve beslemeleri anlatmak için yapabilir. Geçersiz giriş sorunlarını önlemek için, bu (Çözümleyici üzerinden) düzenli ifadeler kullanarak nihayet haklı bir durum olabilir for once :)

Bu HTML testi uymuyorsa, bunun üzerine Atom / RSS testler. Bir yem olarak tanınan, ya da XML ayrıştırıcı geçersiz giriş bobinleri değilse, tekrar HTML düşer.

ne o vahşi benziyor - beslemesi sağlayıcıları her zaman bu kurallara uyup uymadığını - farklı bir soru, ama zaten bir sürü bu şekilde tanımak gerekir.

Ben bu firefox (ya da diğer herhangi bir tarayıcı) yapar yolu varsayalım olarak en iyi seçim Content-Type başlık oluyor düşünüyorum. Bu konuda düşünüyorsanız Ayrıca, Content-Type gerçekten sunucu yanıtı içeriği işlemek için nasıl kullanıcı ajanları söyler yoldur. Hemen hemen tüm iyi HTTP sunucusu doğru Content-Type başlığı gönderir.

Yine de (bu kriterleri size kalmış) ilki "başarısız" Eğer ikinci bir seçenek olarak içerik rss / atom tanımlamak için deneyebilirsiniz.

Ek bir yararı sadece bu nedenle bu gibi kıvrılma ile yapabilirsiniz, vb bant genişliği zaman tasarrufu, yerine tüm belgenin başlığı istemeniz gerekir ki:

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

Biber,

Doğru işleyicisi göndermek için Content-Type HTTP yanıt başlığını kullanın.

Ocak