7

PHP로 만든 RSS 2.0 리더 소스

· 2012-11-22 (목) 14:48:40 · 5944 · 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건
+
제목 글쓴이 날짜 조회
13-07-14 조회 5,406
13-07-14 조회 5,382
13-07-14 조회 4,658
13-07-14 조회 4,262
13-07-14 조회 4,125
13-07-14 조회 4,185
13-07-14 조회 4,906
13-07-14 조회 4,548
13-07-14 조회 4,332
13-07-14 조회 5,378
13-07-14 조회 5,260
13-07-14 조회 5,044
13-07-14 조회 4,744
13-07-14 조회 5,431
13-07-13 조회 3,588
13-07-01 조회 5,683
13-07-01 조회 5,765
13-07-01 조회 3,855
13-07-01 조회 5,282
13-05-27 조회 3,960
13-05-21 조회 4,924
13-05-02 조회 1만
13-04-29 조회 5,187
13-04-15 조회 5,454
13-04-13 조회 6,392
13-02-27 조회 3,853
13-02-26 조회 6,439
13-02-12 조회 5,101
13-02-01 조회 2.3만
13-01-23 조회 3,471
13-01-09 조회 7,997
13-01-07 조회 4,927
13-01-07 조회 3,673
13-01-04 조회 1.3만
13-01-03 조회 1.2만
12-12-31 조회 6,205
12-12-27 조회 4,432
12-12-27 조회 4,098
12-12-27 조회 8,779
12-12-18 조회 3,613
12-12-12 조회 3,674
12-12-12 조회 6,710
12-12-12 조회 8,129
12-12-05 조회 5,332
12-12-01 조회 6,673
12-11-22 조회 4,594
12-11-09 조회 5,435
12-11-09 조회 7,516
12-10-29 조회 4,758
12-10-16 조회 6,315
12-10-09 조회 5,359
12-09-02 조회 4,452
12-09-01 조회 3,570
12-08-30 조회 4,209
12-08-30 조회 4,212
12-08-28 조회 3,533
12-08-21 조회 7,152
12-08-20 조회 3,667
12-08-18 조회 5,067
12-08-18 조회 3,444
12-08-11 조회 3,622
12-08-09 조회 3,766
12-08-07 조회 3,664
12-08-07 조회 4,241
12-08-01 조회 4,552
12-08-01 조회 4,422
12-07-20 조회 9,826
12-07-17 조회 4,194
12-07-15 조회 3,925
12-07-10 조회 4,220
12-07-09 조회 6,928
12-07-05 조회 3,263
12-07-04 조회 3,421
12-06-30 조회 5,686
12-06-28 조회 3,759
12-06-20 조회 3,896
12-06-16 조회 3,206
12-06-14 조회 3,856
12-06-07 조회 3,907
12-06-06 조회 6,193
12-05-27 조회 4,476
12-05-25 조회 3,220
12-05-25 조회 3,052
12-05-24 조회 3,123
12-05-24 조회 4,521
12-05-23 조회 3,883
12-05-22 조회 6,497
12-05-15 조회 3,847
12-05-15 조회 3,623
12-05-14 조회 3,048
12-05-12 조회 3,515
12-05-11 조회 7,013
12-05-07 조회 4,417
12-04-28 조회 3,624
12-04-25 조회 5,250
12-04-15 조회 3,852
12-04-12 조회 4,685
12-04-11 조회 3,433
12-04-08 조회 3,302
12-03-21 조회 6,359