2

我目前正在用 PHP 构建一个新的在线提要阅读器。我正在开发的功能之一是提要自动发现。如果用户输入网站 URL,脚本将检测到它不是提要,并通过解析 HTML 以找到正确的<link>标签来查找真正的提要 URL。

问题是,我目前检测 URL 是提要还是网站的方式仅在部分时间有效,而且我知道这不是最佳解决方案。现在我正在接受 CURL 响应并运行它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 中的提要或非提要之间差异的好方法有什么建议吗?

4

4 回答 4

8

我会嗅探这些格式具有的各种唯一标识符:

原子:来源

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

网景RSS 0.91

<rss version="0.91">

等等等等(请参阅第二个源链接以获取完整概述)。

<feed>据我所知,通过分别查找和<rss>标签来分离 Atom 和 RSS 应该很容易。另外,您不会在有效的 HTML 文档中找到它们。

<html>您可以通过首先查找和<body>元素进行初步检查,以区分 HTML 和提要。为了避免无效输入的问题,这可能是使用正则表达式(通过解析器)最终一次合理的情况:)

如果它与 HTML 测试不匹配,则对其运行 Atom / RSS 测​​试。如果它未被识别为提要,或者 XML 解析器因无效输入而阻塞,请再次回退到 HTML。

在野外看起来是什么样子 - 提要提供者是否总是符合这些规则 - 是一个不同的问题,但您应该已经能够通过这种方式识别很多东西。

于 2010-03-14T17:18:00.957 回答
3

我认为您最好的选择是获取Content-Type标题,因为我认为这是 Firefox(或任何其他浏览器)的方式。此外,如果你仔细想想,这Content-Type确实是服务器告诉用户代理如何处理响应内容的方式。几乎所有体面的 HTTP 服务器都会发送正确的Content-Type标头。

不过,如果第一个“失败”(此标准取决于您),您可以尝试将内容中的 rss/atom 识别为第二选择。

另一个好处是您只需要请求标题而不是整个文档,从而节省带宽、时间等。您可以使用 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 Feed 而构建的组件来解析您的数据,例如Zend_Feed_Reader

这样,如果解析成功,您将非常确定您使用的 URL 确实是有效的 RSS/ATOM 提要。


而且我应该补充一点,您也可以使用这样的组件来解析提要以提取其信息:无需重新发明轮子,“手动”解析 XML,并自己处理特殊情况。

于 2010-03-14T17:16:18.190 回答
0

使用 Content-Type HTTP 响应标头分派到正确的处理程序。

于 2010-03-14T18:24:18.177 回答