Pergunta

Atualmente estou construindo um novo leitor de feeds on-line em PHP. Uma das características que eu estou trabalhando é alimentar auto-descoberta. Se um usuário insere uma URL do site, o script irá detectar que a sua não um feed e olhar para o URL do feed verdadeira analisando o código HTML para a tag apropriada.

O problema é, a maneira im atualmente detectar se o URL é um feed ou um site só funciona parte do tempo, e eu sei que não pode ser a melhor solução. Agora im levando a resposta CURL e executá-lo através simplexml_load_string, se ele não pode analisá-lo eu tratá-lo como um site. Aqui está o código.

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

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

Obviamente, isso não é o ideal. Além disso, quando ele é executado em um site HTML que pode analisar, ele acha que é um feed.

Todas as sugestões sobre uma boa maneira de detectar a diferença entre um feed ou não-alimentar em PHP?

Obrigado,

Pimenta http://feedingo.com

Foi útil?

Solução

Eu farejar para os vários identificadores exclusivos esses formatos têm:

Atom: Fonte

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

RSS 0.90: Fonte

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

etc. etc. (Veja o link da fonte 2 para uma visão geral completa).

Tanto quanto eu posso ver, separando Atom e RSS deve ser muito fácil, procurando por <feed> e <rss> marcas, respectivamente. Além disso, você não vai encontrar aqueles em um documento HTML válido.

Você poderia fazer uma verificação inicial para dizer HTML e alimentações de distância, procurando por <html> e <body> elementos primeiros. Para evitar problemas com uma entrada inválida, este pode ser um caso em que o uso de expressões regulares (mais de um analisador) é finalmente justificada por uma vez :)

Se ele não coincidir com o teste HTML, execute os testes Atom / RSS sobre ele. Se ele não é reconhecido como um animal, ou as bobinas parser XML em uma entrada inválida, cair de volta para HTML novamente.

o que parece em estado selvagem - se os prestadores de alimentação sempre estar de acordo com essas regras -. É uma questão diferente, mas você já deve ser capaz de reconhecer um monte desta forma

Outras dicas

Eu acho que a melhor opção é obter o cabeçalho Content-Type como eu assumir que é a maneira como o Firefox (ou qualquer outro browser) faz isso. Além disso, se você pensar sobre isso, o Content-Type é realmente o caminho servidor informa os agentes do usuário como processar o conteúdo da resposta. Quase qualquer servidor HTTP decente envia um cabeçalho Content-Type correta.

No entanto, você pode tentar identificar RSS / Atom no conteúdo como uma segunda opção se o primeiro "não" (este critério é até você).

Um benefício adicional é que você só precisa solicitar o cabeçalho em vez de todo o documento, poupando-lhe largura de banda, tempo, etc. Você pode fazer isso com a onda como esta:

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

Por que não tentar analisar seus dados com um componente construído especificamente para analisar RSS / Atom Feed, como Zend_Feed_Reader ?

Com isso, se a análise for bem-sucedido, você vai ter certeza de que a URL que você usou é de fato um feed RSS / ATOM válido.


E devo acrescentar que você poderia usar um tal componente de alimentação de análise, a fim de extrair suas informações, também: não há necessidade de re-inventar a roda, a análise do XML " à mão ", e lidar com casos especiais você mesmo.

Pepper,

Use o Content-Type cabeçalho de resposta HTTP para envio para o manipulador de direito.

Jan

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top