문제

현재 PHP에서 새로운 온라인 피드 리더를 구축하고 있습니다. 내가 작업하는 기능 중 하나는 Feed Auto Discovery입니다. 사용자가 웹 사이트 URL을 입력하면 스크립트가 피드가 아닌 것을 감지하고 적절한 태그를 위해 HTML을 구문 분석하여 실제 피드 URL을 찾습니다.

문제는 URL이 피드인지 웹 사이트가 시간의 일부만 작동하는지 현재 감지하는 방식이며 최상의 솔루션이 될 수 없다는 것을 알고 있습니다. 지금은 컬 반응을 취하고 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의 피드 나 비 공급의 차이를 감지하는 좋은 방법에 대한 제안이 있습니까?

감사,

후추http://feedingo.com

도움이 되었습니까?

해결책

나는 해당 형식에 다음과 같은 다양한 고유 식별자를 스니핑 할 것입니다.

원자: 원천

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

Netscape Rss 0.91

<rss version="0.91">

등 등. (전체 개요는 두 번째 소스 링크 참조).

내가 볼 수있는 한, 원자와 RSS를 분리하는 것은 찾아서 매우 쉬워야합니다. <feed> 그리고 <rss> 각각 태그. 또한 유효한 HTML 문서에서 찾을 수 없습니다.

HTML에게 말하기 위해 초기 점검을 할 수 있고 찾아서 피드를 구분할 수 있습니다. <html> 그리고 <body> 먼저 요소. 유효하지 않은 입력 문제를 피하기 위해 정규 표현식 (파서 위에)을 사용하는 경우가 마침내 정당화 될 수 있습니다. 한 번 :)

HTML 테스트와 일치하지 않으면 Atom / RSS 테스트를 실행하십시오. 피드로 인식되지 않거나 XML 파서가 유효하지 않은 입력을 질식시키는 경우 다시 HTML로 돌아갑니다.

사료 공급자가 항상 이러한 규칙을 준수하는지 여부는 야생에서 보이는 것이 다른 질문이지만 이미 이런 식으로 많이 인식 할 수 있어야합니다.

다른 팁

당신의 최선의 선택은 Content-Type 내가 Firefox (또는 다른 브라우저)가하는 방식이라고 가정하면서 헤더. 게다가, 당신이 그것에 대해 생각한다면, Content-Type 실제로 서버는 사용자 에이전트에게 응답 컨텐츠를 처리하는 방법을 알려줍니다. 거의 모든 괜찮은 HTTP 서버가 올바른 것을 보냅니다 Content-Type 헤더.

그럼에도 불구하고 첫 번째 하나가 "실패"하는 경우 (이 기준은 귀하에게 달려 있음) 내용의 RSS/Atom을 두 번째 선택으로 식별 할 수 있습니다.

추가적인 이점은 전체 문서 대신 헤더를 요청하면 대역폭, 시간 등을 절약해야한다는 것입니다.

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

RSS/Atom Feed를 구문 분석하기 위해 특별히 구축 된 구성 요소로 데이터를 구문 분석하는 것이 어떻습니까? Zend_Feed_Reader ?

이를 통해 구문 분석이 성공하면 사용한 URL이 실제로 유효한 RSS/Atom 피드임을 확신 할 수 있습니다.


또한 정보를 추출하기 위해 그러한 구성 요소를 사용하여 피드를 구문 분석 할 수 있다고 덧붙여 야합니다. 휠을 다시 발명 할 필요가 없습니다.손으로", 그리고 특별한 경우를 다루는 것.

후추,

컨텐츠 유형 HTTP 응답 헤더를 사용하여 오른쪽 핸들러로 발송하십시오.

1 월

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top