Pregunta

Actualmente estoy construyendo un nuevo lector de fuentes en línea en PHP. Una de las características que estoy trabajando es alimentar el descubrimiento automático. Si un usuario introduce una URL del sitio web, el script detecta que no es una fuente y buscar la URL de la fuente verdadera mediante el análisis del código HTML de la etiqueta adecuada.

El problema es, la forma im detectando actualmente si la URL es un alimento o un sitio web sólo funciona parte del tiempo, y sé que no puede ser la mejor solución. En este momento im teniendo la respuesta Curl y la ejecución a través simplexml_load_string, si no se puede analizar que lo trato como un sitio web. Aquí está el código.

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

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

Obviamente, esto no es lo ideal. Además, cuando se ejecuta en una página web HTML que se puede analizar, se piensa que es un feed.

Cualquier sugerencia en una buena manera de detectar la diferencia entre un alimento o no alimentación en PHP?

Gracias,

Pimienta http://feedingo.com

¿Fue útil?

Solución

Me olfatear para los distintos identificadores únicos estos formatos tienen:

Atom: Fuente

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

RSS 0.90: Fuente

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://my.netscape.com/rdf/simple/0.9/">

0,91 Netscape RSS

<rss version="0.91">

etc. etc. (Véase el enlace de la fuente segunda para obtener una descripción completa).

Por lo que yo puedo ver, separando Atom y RSS debería ser bastante fácil mediante la búsqueda de etiquetas <feed> y <rss>, respectivamente. Además, usted no encontrará los de un documento HTML válido.

Se podría hacer una comprobación inicial para contar HTML y alimenta además mediante la búsqueda de <html> y <body> primeros elementos. Para evitar problemas con la entrada no válida, esto puede ser un caso en el que el uso de expresiones regulares (más de un analizador sintáctico) finalmente está justificado por una vez :)

Si no coincide con la prueba de HTML, ejecutar las pruebas Atom / RSS en él. Si no se reconoce como un animal o el analizador XML ahoga en una entrada no válida, caer de nuevo a HTML nuevo.

como se ve en la naturaleza - si los proveedores de alimentación siempre se ajustan a las normas -. Es una cuestión diferente, pero ya debe ser capaz de reconocer una gran cantidad de esta manera

Otros consejos

Creo que su mejor opción es conseguir la cabecera Content-Type como supongo que esa es la forma en que Firefox (o cualquier otro navegador) lo hace. Además, si se piensa en ello, la Content-Type es de hecho la forma en que el servidor le dice a los agentes de usuario cómo procesar el contenido de la respuesta. Casi cualquier servidor HTTP envía una cabecera decente Content-Type correcta.

Sin embargo, usted podría tratar de identificar RSS / Atom en el contenido como una segunda opción si el primero "falla" (este criterio depende de usted).

Un beneficio adicional es que sólo tiene que solicitar la cabecera en lugar de todo el documento, con el consiguiente ahorro que ancho de banda, tiempo, etc Usted puede hacer esto con el enrollamiento de la siguiente manera:

<?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 qué no tratar de analizar sus datos con un componente construido específicamente para analizar RSS / ATOM, como Zend_Feed_Reader ?

Con esto, si el análisis tiene éxito, podrás bastante seguro de que la URL que utilizó es de hecho un / ATOM RSS válido.


Y debo añadir que se puede utilizar un componente de este tipo para analizar el feed con el fin de extraer sus informaciones, también: no hay necesidad de reinventar la rueda, análisis del XML " a mano ", y hacer frente a casos especiales sí mismo.

Pimienta,

Utilice el encabezado de respuesta HTTP Content-Type para enviar al controlador de la derecha.

Jan

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top