如何检测页面是RSS还是ATOM源

Pep*_*per 2 php rss feedparser atom-feed

我目前正在用PHP构建一个新的在线Feed阅读器.我正在研究的功能之一是Feed自动发现.如果用户输入网站URL,脚本将检测到它不是Feed,并通过解析HTML以获取正确的标记来查找实际的Feed URL.

问题是,我目前正在检测URL是Feed还是网站的方式只能部分工作,我知道它不是最好的解决方案.现在我正在接受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
}
Run Code Online (Sandbox Code Playgroud)

显然,这并不理想.此外,当它运行到可以解析的HTML网站时,它会认为它是一个提要.

有关检测PHP中的feed或non-feed之间差异的好方法的任何建议?

谢谢,

辣椒 http://feedingo.com

Pek*_*ica 8

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

原子:来源

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
Run Code Online (Sandbox Code Playgroud)

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/">
Run Code Online (Sandbox Code Playgroud)

Netscape RSS 0.91

<rss version="0.91">
Run Code Online (Sandbox Code Playgroud)

等等(有关完整概述,请参阅第二个源链接).

据我所知,通过分别查找<feed><rss>标记,分离Atom和RSS应该非常简单.另外,您无法在有效的HTML文档中找到它们.

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

如果它与HTML测试不匹配,请对其运行Atom/RSS测试.如果它未被识别为提要,或XML解析器在无效输入上窒息,则再次回退到HTML.

在野外看起来是什么 - 饲料供应商是否始终遵守这些规则 - 是一个不同的问题,但你应该已经能够以这种方式认识到很多.