7

PHP로 만든 RSS 2.0 리더 소스

· 2012-11-22 (목) 14:48:40 · 5906 · 3
소스는 PHP5로 작성했고, 내장된 SAX 파서를 이용했습니다.
SAX파서는 이벤트 기반 파서라서 구현도 간단하고, 속도도 빠릅니다.

RSS는 현재 가장 널리 쓰이는 RSS 2.0을 대상으로 했습니다.
이글루스와 테터도 RSS 2.0을 지원하고 있습니다.

rss_fetch.php
<?php

include_once 'lib.php';

//가져올 RSS 주소를 지정하면됩니다.
$urls = array('http://sizuha.egloos.com/index.xml', 'http://kori2sal.innori.com/rss');

foreach ($urls as $url):
$handle = fopen($url, 'r');

if ($handle):
$document = '';

while (!feof($handle))
$document .= fgets($handle, 4096);

fclose($handle);

//파서 생성
$rss = new RSSParser;

//파싱
$rss->setRSS($document);
rssParse($rss);

$rss = NULL;
endif;
endforeach;

?>

lib.php
<?php

function rssParse($rss_obj)
{
//내장 XML 파서 생성
$xml_parser = xml_parser_create('UTF-8');

xml_set_object($xml_parser, $rss_obj);
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE);

//XML 파서에 이벤트 핸들러를 할당
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

//XML 파싱
xml_parse($xml_parser, $rss_obj->getRSS());
xml_parser_free($xml_parser);
}


class RSSParser
{
private $rss_doc;

private $current_element;
private $in_item = FALSE;
private $in_description = FALSE;
private $title;
private $date;
private $link;
private $category;
private $content;


function setRSS($rss_text)
{
$this->rss_doc = $rss_text;
}

function getRSS()
{
return $this->rss_doc;
}

//태그가 시작하는 부분에서 처리할 내용
function startElement($parser, $element, $attrs)
{
if ($this->in_description) return;

$this->current_element = strtoupper($element);

switch ($this->current_element):
case 'ITEM' :
$this->in_item = TRUE;
break;

case 'DEscRIPTION' :
if ($this->in_item) {
$this->in_description = TRUE;
$this->content = '';
}
break;

default:
break;
endswitch;
}

function endElement($parser, $element)
{
$el = strtoupper($element);

if ($this->in_description and 'DEscRIPTION' != $el) return;

switch (strtoupper($el)):
case 'ITEM' :
$this->in_item = FALSE;
$this->printItem(); // 저장된 포스트를 출력하거나 DB로 자장하면 됨.
break;

case 'DEscRIPTION' :
if ($this->in_item) {
$this->in_description = FALSE;
}
break;

default:
break;
endswitch;

$this->current_element = '';
}

function characterData($parser, $data)
{
if ('' == trim($data)) return;

if ($this->in_item):

switch ($this->current_element):
case 'TITLE' :
$this->title = $data;
break;

case 'DEscRIPTION' :
$this->content .= $data; //반드시 .= 연산자를 써야함!
break;

case 'CATEGORY' :
$this->category = $data;
break;

case 'PUBDATE' :
$this->date = $data;
break;

case 'LINK' :
$this->link = $data;
break;
endswitch;

endif;
}

//여기서는 바로 출력을 하지만, DB에 저장하는 방식으로 구현할 수도 있습니다.
private function printItem()
{
echo "<P><STRONG>";
echo $this->title;
echo "</STRONG>";

echo " (";
echo $this->date.")</P>";

echo $this->content;
echo "<BR>";
echo $this->category." | ";
echo $this->link;

echo "<br><br>";
}

}//end of class

?>



RSS 리더를 만들 때의 주의사항

1. RSS는 UTF-8로 인코딩되어 있습니다. 따라서 RSS의 데이터를 변환없이 그냥 웹페이지에 뿌리려면, 웹페이지 역시 UTF-8로 인코딩되어 있어야 합니다. 저는 모든 작업 파일들(PHP, HTML, TXT)을 전부 UTF-8로 통일했습니다.

2. RSS의 PubDate 태그는 게시물의 날짜를 담고 있는 태그이지만, 문제는 이것이 GMT 시간입니다. 웹에 게시할때는 현지(한국) 시간으로 변환해야 할 것입니다.

출처: http://webcache.googleusercontent.com/search?q=cache:_9o7jV1zW0gJ:sir.co.kr/bbs/board.php%3Fbo_table%3Dtip_php%26wr_id%3D1544%26page%3D2+site:sir.co.kr+rss.lib.php&cd=4&hl=ko&ct=clnk


|

댓글 3개

2012-11-22 (목) 15:10:19
감솨합니다!
편하겠네요..
감사합니다
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
16-06-03 조회 2,748
15-07-30 조회 3,243
15-06-08 조회 5,299
15-05-27 조회 4,248
15-01-08 조회 6,546
14-12-30 조회 5,175
14-10-10 조회 5,218
14-08-13 조회 6,193
14-08-11 조회 4,963
14-08-06 조회 6,316
14-03-19 조회 7,263
13-04-26 조회 9,463
12-12-15 조회 5,013
12-12-15 조회 7,248
12-12-11 조회 5,349
12-11-21 조회 5,834
12-10-11 조회 4,955
12-10-03 조회 4,638
12-09-20 조회 5,979
12-09-02 조회 4,125
12-08-29 조회 5,022
12-08-29 조회 3,952
12-08-24 조회 4,083
12-08-18 조회 4,324
12-08-17 조회 4,283
12-08-16 조회 3,613
12-08-06 조회 5,381
12-08-05 조회 4,633
12-08-03 조회 4,406
12-08-03 조회 4,542
12-07-29 조회 3,375
12-07-24 조회 3,985
12-07-22 조회 3,475
12-07-20 조회 4,135
12-07-19 조회 4,448
12-07-19 조회 3,804
12-07-19 조회 3,707
12-07-19 조회 5,387
12-07-19 조회 3,348
12-07-18 조회 4,908
12-07-15 조회 3,911
12-07-14 조회 3,651
12-07-12 조회 4,331
12-07-11 조회 3,637
12-07-11 조회 3,365
12-07-11 조회 3,308
12-07-10 조회 4,490
12-07-09 조회 3,214
12-07-09 조회 4,097
12-07-09 조회 4,497
12-07-08 조회 4,328
12-07-07 조회 5,347
12-07-06 조회 4,632
12-07-06 조회 3,890
12-07-06 조회 3,634
12-07-06 조회 3,651
12-07-02 조회 5,365
12-07-02 조회 4,049
12-06-29 조회 3,563
12-06-28 조회 4,077
12-06-26 조회 3,668
12-06-26 조회 4,790
12-06-21 조회 3,754
12-06-20 조회 4,406
12-06-20 조회 3,936
12-06-15 조회 4,443
12-06-15 조회 4,194
12-06-13 조회 7,210
12-06-05 조회 7,185
12-06-04 조회 3,794
12-06-03 조회 3,642
12-05-31 조회 3,644
12-05-28 조회 6,464
12-05-27 조회 3,685
12-05-25 조회 3,867
12-05-23 조회 4,107
12-05-21 조회 4,967
12-05-17 조회 3,925
12-05-17 조회 3,801
12-05-09 조회 3,821
12-05-07 조회 4,069
12-05-02 조회 4,373
12-05-01 조회 4,443
12-04-30 조회 3,285
12-04-30 조회 4,237
12-04-25 조회 4,290
12-04-25 조회 4,730
12-04-24 조회 3,716
12-04-24 조회 4,466
12-04-23 조회 3,501
12-04-20 조회 3,131
12-04-17 조회 5,331
12-04-16 조회 4,214
12-04-14 조회 3,519
12-04-14 조회 3,560
12-04-14 조회 3,628
12-04-13 조회 3,253
12-04-13 조회 4,444
12-04-13 조회 6,034
12-04-12 조회 3,194