2008-10-30 7 views
118

현재 Magpie RSS을 사용하고 있지만 RSS 또는 Atom 피드가 제대로 구성되지 않은 경우 가끔 넘어집니다. PHP로 RSS와 Atom 피드를 파싱 할 수있는 다른 옵션이 있습니까?PHP로 RSS/Atom 피드를 구문 분석하는 가장 좋은 방법

+1

있다 이 요청은 대부분의 피드 리더가 PHP의 핵심 XML 리더를 사용하고 있으며 XML 표준에 따라 XML 형식이 적절하지 않은 경우 XML 표준을 따르지 않을 경우 XML 리더를 사용하지 않고 텍스트 리더를 사용할 수 있습니다. 그러나로드 서버의 성능이 크게 향상됩니다. 나는 이것이 사람들에게 XML 피드 리더를 사용할 때의 단점을 인식하게 만들었다. –

+1

유효하지 않은 XML을 구문 분석하지 마라. 근원을 비난하십시오. – Lothar

답변

28

귀하의 다른 옵션은 다음과 같습니다 .

물론 RSS 형식이 아닌 RSS/Atom 피드를 테스트하지는 않았으므로 그 내용과 잘 맞지 않습니다. Google 표준이 상당히 표준에 부합한다고 가정합니다. :)

+4

젠드 피드 http://framework.zend.com/manual/en/zend.feed.html – artur

+173

나는 그런 코멘트를 좋아하지 않아 링크를 제공하지 않는다. 당신이 구글처럼 보이고 몇 가지 최고의 결과로 연결됩니다. 특히 asker가 RSS를 경험하고 더 나은 파서가 필요하기 때문에. –

+3

누군가가 약간의 조언을 필요로하는 경우에, 마지막 RSS는 위에 나열된 세 가지 중에서 가장 쉽습니다. 오직 하나의 파일 만 "요구"할 수 있으며 알맞은 배열 출력으로 5 줄 내에서 RSS를 가져올 수 있습니다. – Raptor

2

내가 구글 리더 피드를 구문 분석 SimplePie를 사용하고 꽤 잘 작동하고 괜찮은 기능 세트가 있습니다

6

HTML 깔끔한 라이브러리가 일부 잘못된 XML 파일을 고칠 수 있습니다. 파서에 전달하기 전에 피드를 실행하면 도움이 될 수 있습니다.

151

저는 항상 the SimpleXML functions built in to PHP을 사용하여 XML 문서를 구문 분석했습니다. 직관적 인 구조를 가진 몇 안되는 일반 파서 중 하나입니다. RSS 피드와 같은 특정 클래스에 대해 의미있는 클래스를 만드는 것이 매우 쉽습니다. 또한 XML 경고 및 오류를 감지하고 HTML 깔끔한 (Ceejayoz 언급 한 바와 같이) 소스를 실행하여이를 정리하고 다시 시도 할 수 있습니다. 피드는 XML을 잘 형성되지 않는 경우

class BlogPost 
{ 
    var $date; 
    var $ts; 
    var $link; 

    var $title; 
    var $text; 
} 

class BlogFeed 
{ 
    var $posts = array(); 

    function __construct($file_or_url) 
    { 
     $file_or_url = $this->resolveFile($file_or_url); 
     if (!($x = simplexml_load_file($file_or_url))) 
      return; 

     foreach ($x->channel->item as $item) 
     { 
      $post = new BlogPost(); 
      $post->date = (string) $item->pubDate; 
      $post->ts = strtotime($item->pubDate); 
      $post->link = (string) $item->link; 
      $post->title = (string) $item->title; 
      $post->text = (string) $item->description; 

      // Create summary as a shortened body and remove images, 
      // extraneous line breaks, etc. 
      $post->summary = $this->summarizeText($post->text); 

      $this->posts[] = $post; 
     } 
    } 

    private function resolveFile($file_or_url) { 
     if (!preg_match('|^https?:|', $file_or_url)) 
      $feed_uri = $_SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url; 
     else 
      $feed_uri = $file_or_url; 

     return $feed_uri; 
    } 

    private function summarizeText($summary) { 
     $summary = strip_tags($summary); 

     // Truncate summary line to 100 characters 
     $max_len = 100; 
     if (strlen($summary) > $max_len) 
      $summary = substr($summary, 0, $max_len) . '...'; 

     return $summary; 
    } 
} 
+2

시작 태그가없는 종료 태그가 있습니다. ;) –

+116

글쎄, 하나 있었지만, 그 위에 빈 줄이 없어서 SO의 코드 포맷터에 의해 먹혀 들었다. 관련 메모에서 대문자로 문장을 시작하지 않았습니다. ;) –

+4

'$ feed_uri = $ feed_or_url;'을'$ feed_uri = $ file_or_url;'로 변경하십시오. ... 그 외,이 코드를 보내 주셔서 감사합니다! 그것은 위대한 작품! – Tim

12

이, 당신은, 예외없이 그것을 거부하지 야지 :

는 SimpleXML을 사용하여이 매우 거친, 간단한 클래스를 생각해 보자. 피드 작성자 a bozo에게 전화를 걸 수 있습니다.

그렇지 않으면 당신은 HTML이에 결국 것을 엉망으로 도로를 포장하고 있습니다. 개인적으로

+3

+1, 올바른 형식이 아닌 XML을 처리하지 마십시오. 우리는 그들과 함께 나쁜 경험을 했어, 나를 믿어, 그것은 큰 고통이었다 : ( –

+33

그러나 프로그래머는 비즈니스 파트너를 선택하지 못하고 주어진 것을 파싱해야한다. –

+2

범용 RSS/Atom 피드 리더기? 부적절한 XML 파일이 HTML을 엉망으로 만들 수 있다면, 누가 Bozo인가? – yPhil

1

내가 BNC 고급 나는, 4 개 라인

32

를 매우 쉽게 사용할 수있는 템플릿 시스템을 좋아 Parser- 피드 사용 rss를 배열로 가져 오십시오. 더 복잡한 솔루션을

$feed = implode(file('http://yourdomains.com/feed.rss')); 
$xml = simplexml_load_string($feed); 
$json = json_encode($xml); 
$array = json_decode($json,TRUE); 

$feed = new DOMDocument(); 
$feed->load('file.rss'); 
$json = array(); 
$json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue; 
$json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue; 
$json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue; 
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item'); 

$json['item'] = array(); 
$i = 0; 

foreach($items as $key => $item) { 
$title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue; 
$description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue; 
$pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue; 
$guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue; 

$json['item'][$key]['title'] = $title; 
$json['item'][$key]['description'] = $description; 
$json['item'][$key]['pubdate'] = $pubDate; 
$json['item'][$key]['guid'] = $guid; 
} 

echo json_encode($json); 
+2

방금 ​​해봤습니다. 그것은 배열을주지 않는다 – samayo

+0

내가 사용하고있는 rss 피드를 나에게 줄 수 있니? – PJunior

+2

궁금한 점이 있으시면. 그가 tumblr RSS 피드를 사용하고있는 것 같습니다. Anytumblrsite.com/rss는 동일한 출력을 제공합니다. – andrewk

-1

또 다른 위대한 무료로 파서 - 그것은 매우 가벼운 (단 3킬로바이트) 사용하기 간단 http://bncscripts.com/free-php-rss-parser/ !

+0

은 gzinflate 및 base64_decode를 사용하여 "훌륭함"이라고 말하며 일반적으로 보안을 위해 사용하지 않습니다. –

15

나는 구문 분석하는 간단한 스크립트를 소개하고자 RSS :

$i = 0; // counter 
$url = "http://www.banki.ru/xml/news.rss"; // url to parse 
$rss = simplexml_load_file($url); // XML parser 

// RSS items loop 

print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src 

foreach($rss->channel->item as $item) { 
if ($i < 10) { // parse only 10 items 
    print '<a href="'.$item->link.'">'.$item->title.'</a><br />'; 
} 

$i++; 
} 
관련 문제