همانطور که می دانیم، فید آر اس اس (RSS Feed) یا خوراک وب، یکی از کاربردی ترین روش ها برای اطلاع از به روز رسانی یک سایت یا وبلاگ است که خیلی از کاربران ترجیح می دهند از این طریق، مطالب صفحه مورد علاقه خودشان را دنبال کنند، اما استفاده از این امکان، تنها به همین مورد محدود نمی شود، به فرض می توان لیستی از مطالب سایتها یا وبلاگ ها را به صورت لینک باکس طراحی کرد
و در وبلاگ یا سایت خود به نمایش درآورد یا تازه ترین مطالب بخش های مختلف سایت یا وبلاگ را در صفحه اصلی به بازدیدکننده گان نشان داد و یا هر ایده ی دیگری که به ذهنتان می رسد؛ به همین دلیل در این مطلب قصد داریم نحوه ساخت فید خوان آر اس اس (RSS Feed Reader) را با php آموزش دهیم، به امید اینکه مفید واقع شود.
آشنایی با شیوه نگارش فید آر اس اس (RSS Feed)
قبل از اینکه به قسمت کدنویسی php بپردازیم، بد نیست با شیوه نگارش (syntax) یک فید rss آشنا شویم، چرا که نهایتا برنامه php که خواهیم نوشت، فایل xml مقصد یا همان فید آر اس اس را تجزیه تحلیل خواهد کرد.
یک فید آر اس اس معمولی، از تگ های خاصی به زبان xml استفاده می کند که در زیر نمونه آن را مشاهده می کنید.
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>عنوان فید</title> <link>https://hellodigi.ir</link> <description>توضیح</description> <language>fa</language> <copyright>Copyright</copyright> <item> <title>عنوان مطلب</title> <description>توضیح مطلب</description> <link>لینک مطلب</link> <guid>لینک مطلب</guid> <pubDate>تاریخ مطلب به میلادی</pubDate> <source url="https://hellodigi.ir/rss.xml">سلام دیجی</source> </item> </channel> </rss>
توضیح:
- یک فید آر اس اس از تگ هایی کلیدی تشکیل شده که هر کدام برای نمایش محتوای خاصی کاربرد دارند، مثلا تگ title برای نمایش عناوین مطالب است یا link، آدرس لینک مطلب مورد نظر را در خود نمایش می دهد، description برای پیش نمایش مطلب و pubDate تاریخ ایجاد آن را نشان می دهد.
- کد php که در ادامه به آن اشاره خواهیم کرد، با دریافت فایل xml فید، تگ های آن را تجزیه کرده و نتایج را نمایش می دهد.
کد php فید خوان آر اس اس (RSS Feed Reader)
برای نمایش محتوای فید های آر اس اس، در سایت یا وبلاگ خود، می توانید از توابع زیر که به زبان php نوشته شده اند استفاده کنید، کافی است آدرس فید را جایگزین مقادیر پیش فرض در کد کنید.
<?php //تنظیمات $url = 'https://hellodigi.ir/rss.xml';//آدرس فید $num = '5';//تعداد لینک //توابع function xml2array($text){ $reg_exp = '/<(\w+)[^>]*>(.*?)<\/\\1>/s'; preg_match_all($reg_exp, $text, $match); $loop = 0; foreach($match[1] as $key=>$val){ if(preg_match($reg_exp, $match[2][$key])){ @$array[$val][$loop] = xml2array($match[2][$key]); } else{ @$array[$val] = $match[2][$key]; } $loop++; } return $array; } function display_feed($url, $num, $template="<div class=\"rss-item\"> » <a href=\"#link#\" target=\"_blank\">#title#</a></div>"){ if ($rss = @file_get_contents($url)){ $rss = xml2array($rss); if(is_array($rss)){ $code = ""; $count = 0; foreach($rss['rss'][0]['channel'][0]['item'] as $val){ $tpl = $template; foreach($val as $key => $val2){ $val2 = html_entity_decode(htmlentities(@strip_tags($val2))); $tpl = str_replace("#".strtolower($key)."#", $val2, $tpl); } if ($count < $num) $code .= $tpl; ++$count; } } else{ return FALSE; } echo $code; return TRUE; } else{ return FALSE; } } //خروجی echo("<div class=\"rss-block\">"); display_feed("$url",$num); echo("</div>"); ?>
توضیح:
- آدرس فید خود را در متغیر url جایگزین کنید (حتما آدرس کامل را به صورت http://www یا //:http درج کنید).
- تابع xml2array مقادیر دریافتی از فید را تجزیه کرده و آن را به صورت آریه هایی قابل استفاده در تابع دوم یعنی display_feed در می آورد.
- preg_match_all و preg_match در تابع xml2array، با جایگزینی مقادیر رشته ای با آرایه ها، امکان استفاده از آنها را در php فراهم می کنند.
- در تابع display_feed، محتویات فید مقصد را با file_get_contents دریافت می کنیم.
- در ادامه، تابع display_feed، به صورت داینامیک، تگ ها را با آرایه مقایسه کرده و مقادیر آنها را جایگزین می کند تا سرانجام نتیجه کد به صورت الگوی موجود در متغیر template در هر دور حلقه foreach به مرورگر ارسال شود.
- خروجی کد بالا در بلاکی با آی دی rss-block تولید می شود و هر آیتم، کلاس (css) با نام rss-item دارد، از این کلاس ها برای ایجاد تنظیمات و استایل css دلخواه می توانید استفاده کنید (اگر در این زمینه آشنایی ندارید، می توانید از نمونه پیش فرض، در انتهای همین صفحه استفاده کنید).
تنظیمات و استایل css قابل اعمال بر روی فید خوان php
کد بالا به صورت پیش فرض تنها لینک مطالب را خروجی می دهد، اما همانطور که پیش تر گفتیم، شما می توانید هرکدام از تگ های rss را در خروجی داشته باشید، به طور مثال توضیحات مطالب را با افزودن description به صورت #description# به متغیر template، علاوه بر لینک ها نمایش دهید، به فرض در کد زیر ما این کار را برای تاریخ و توضیحات انجام داده ایم.
function display_feed($url, $num, $template="<div class=\"rss-item\"> » <a href=\"#link#\" target=\"_blank\">#title#</a><br />#description#<br />#pubDate#</div>"){ if ($rss = @file_get_contents($url)){ $rss = xml2array($rss); if (is_array($rss)){ $code = ""; $count = 0; foreach($rss['rss'][0]['channel'][0]['item'] as $val){ $tpl = $template; foreach($val as $key => $val2){ $val2 = html_entity_decode(htmlentities(@strip_tags($val2))); $tpl = str_replace("#".strtolower($key)."#", $val2, $tpl); } if ($count<$num) $code .= $tpl; ++$count; } } else{ return FALSE; } echo $code; return TRUE; } else{ return FALSE; } }
برای اعمال استایل دلخواه نیز می توانید در یک کلاس css مقادیر مورد نظر خود را به کلاس های rss-block و rss-item نسبت دهید، برای مثال:
<style type="text/css"> .rss-block{ border:1px #666 solid; padding:4px; line-height:18px; } .rss-block a{ text-decoration:none; color:#06C; } .rss-block a:hover{ color:#09F; } .rss-item{ height:auto; } </style>
پیش نمایش اسکریپت فید خوان آر اس اس
نمونه کامل کد و پیش نمایشی از آن را می توانید در زیر مشاهده کنید.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title> سلام دیجی | فید خوان آر اس اس با php</title> <!-- https://hellodigi.ir --> <style type="text/css"> body{ font-family:Tahoma, Geneva, sans-serif; font-size:12px; direction:rtl; } .rss-block{ border:1px #666 solid; padding:4px; line-height:18px; } .rss-block a{ text-decoration:none; color:#06C; } .rss-block a:hover{ color:#09F; } .rss-item{ height:auto; } </style> </head> <body> پیش نمایش اسکریپت فید خوان آر اس اس:<br><br> <?php //تنظیمات $url = 'https://hellodigi.ir/rss.xml';//آدرس فید $num = '5';//تعداد لینک //توابع function xml2array($text){ $reg_exp = '/<(\w+)[^>]*>(.*?)<\/\\1>/s'; preg_match_all($reg_exp, $text, $match); $loop = 0; foreach($match[1] as $key=>$val){ if(preg_match($reg_exp, $match[2][$key])){ @$array[$val][$loop] = xml2array($match[2][$key]); } else{ @$array[$val] = $match[2][$key]; } $loop++; } return $array; } function display_feed($url, $num, $template="<div class=\"rss-item\"> » <a href=\"#link#\" target=\"_blank\">#title#</a></div>"){ if ($rss = @file_get_contents($url)){ $rss = xml2array($rss); if(is_array($rss)){ $code = ""; $count = 0; foreach($rss['rss'][0]['channel'][0]['item'] as $val){ $tpl = $template; foreach($val as $key => $val2){ $val2 = html_entity_decode(htmlentities(@strip_tags($val2))); $tpl = str_replace("#".strtolower($key)."#", $val2, $tpl); } if ($count < $num) $code .= $tpl; ++$count; } } else{ return FALSE; } echo $code; return TRUE; } else{ return FALSE; } } //خروجی echo("<div class=\"rss-block\">"); display_feed("$url",$num); echo("</div>"); ?> </body> </html>