我目前正在使用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
}
显然,这并不理想。此外,当它运行到可以解析的HTML网站时,它会认为它是一个提要。
有关检测PHP中Feed或非Feed之间差异的好方法的任何建议吗?
谢谢,
答案 0 :(得分:8)
我会嗅探这些格式所具有的各种唯一标识符:
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">
等。等(有关完整概述,请参阅第二个源链接)。
据我所知,通过分别查找<feed>
和<rss>
标记,分离Atom和RSS应该非常简单。另外,您无法在有效的HTML文档中找到它们。
您可以首先通过查找<html>
和<body>
元素进行初步检查,以告诉HTML并将其分开。为了避免输入无效的问题,可能会出现这样的情况:使用正则表达式(通过解析器)最终证明for once:}
如果它与HTML测试不匹配,请对其运行Atom / RSS测试。如果它未被识别为提要,或XML解析器在无效输入上窒息,则再次回退到HTML。
在野外看起来是什么 - 饲料供应商是否始终遵守这些规则 - 是一个不同的问题,但你应该已经能够以这种方式认识到很多。
答案 1 :(得分: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
}
?>
答案 2 :(得分:2)
为什么不尝试使用专为解析RSS / ATOM Feed而构建的组件来解析数据,例如Zend_Feed_Reader
?
有了这个,如果解析成功,你就会非常确定你使用的URL确实是一个有效的RSS / ATOM提要。
我应该补充一点,你可以使用这样的组件来解析feed以便提取它们的信息:不需要重新发明轮子,解析XML“手动”,并处理特殊情况你自己。
答案 3 :(得分:0)
胡椒,
使用Content-Type HTTP响应标头分派给正确的处理程序。
扬