- Saved searches
- Use saved searches to filter your results more quickly
- License
- YuzuruS/parse-rss
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
- Все о парсинге RSS лент средствами PHP
- '
- '
- '
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.
License
YuzuruS/parse-rss
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.
This parser can handle RSS easily without being conscious of the difference of RSS1.0 and RSS2.0 and ATOM. and gets the minimum necessary value.
- site name
- site url
- article title
- article url
- article description
- date that article posted
- thumbnail of article
This thumbnail is composed by og:img and img tags included description.
$ php composer.phar update yuzuru-s/parse-rss --dev
require __DIR__ . '/../vendor/autoload.php'; use YuzuruS\Rss\Feed; $url = 'http://blog.livedoor.jp/dqnplus/index.rdf'; $ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'; $res = Feed::load($url, $ua, true); echo 'Title:' . $res['channel']['title'] . "\n"; echo 'Link:' . $res['channel']['link'] . "\n"; foreach ($res['item'] as $r) < echo "\t" . 'Article Title:' . $r['title'] . "\n"; echo "\t" . 'Article Description:' . $r['description'] . "\n"; echo "\t" . 'Article Date:' . $r['date'] . "\n"; echo "\t" . 'Article og:img:' . $r['image']['ogimg'] . "\n"; foreach ($r['image']['img'] as $i) < echo "\t\t" . 'Desc:img:' . $i . "\n"; > >
array(2) < 'channel' =>array(2) < 'title' =>string(27) "site name" 'link' => string "site url" > 'item' => array(15) < [0] =>array(5) < 'title' =>string "title" 'link' => string"url" 'date' => string "date" 'description' => string "description" 'image' => array(2) < 'ogimg' =>string(58) "img url" 'img' => array(3) < [0] =>string(58) "img url1" [1] => string(58) "img url2" [2] => string(94) "img url3" > > > [1] => array(5) < .
You can also enable caching:
Feed::$cacheDir = __DIR__ . '/tmp'; Feed::$cacheExpire = '5 hours';
% vendor/bin/phpunit -c phpunit.xml.dist
Currently tested with PHP 7.0.0
Copyright (c) 2016 YUZURU SUZUKI. See MIT-LICENSE for further details.
About
This PHP library can easily parse xml files, especially RSS1.0, RSS2.0 and ATOM.
Все о парсинге RSS лент средствами PHP
Вот только сегодня закончил писать скрипт парсера RSS лент для одного постоянного заказчика и решил поделиться способами и возможностями который нам предлагает язык PHP для этого дела (парсинга RSS). Для начала давайте я скажу о том что такое вообще RSS, вдруг кто-то из вас еще не знает. Сочинять сам не буду, а просто процитирую википедию:
RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами.
То есть это по сути XML (кто незнает что это идем в википедию и читаем), а XML как нам известно хорошо структурированный документ. Я клоню к тому что если в RSS есть открывающий тег, то должен быть и закрывающий (например: ), иначе это не RSS. Думаю на данном этапе суть ясна: нам нужно получить информацию заключенную между тегами. Любая RSS лента имеет заголовок заключенный между тегами и сам текст статьи заключенный между тегами , именно их нам и нужно спарсить.
Теперь расскажу о способах написания RSS парсера и что предлагает нам PHP для реализации.
SimpleXML – это расширение для PHP5 устанавливаемое в него по умолчанию, представляет самый простой и элегантный способ обработки XML (соответственно и RSS) файлов. Это и наиболее предпочтительный способ, но он стал доступным только в 5 версии PHP. Тут нет ничего проще, данный код наглядно показывает как просто парсить RSS ленты средствами SimpleXML:
$url = 'rss.xml'; //адрес RSS ленты $rss = simplexml_load_file($url); //Интерпретирует XML-файл в объект //цикл для обхода всей RSS ленты foreach ($rss->channel->item as $item) { echo ''
.$item->title.''; //выводим на печать заголовок статьи echo $item->description; //выводим на печать текст статьи } ?>
Данный код выведет заголовки и тексты статей из RSS ленты. Просто ведь? Этим SimpleXML и привлекает. Дальше вам нужно будет только правильно распорядиться полученными данными, записать в базу или еще куда-нибудь.
Способ 2 – XML Parser Functions
XML Parser Functions - это стандартные функции PHP для работы с XML доступные начиная c 4-ой версии PHP. Тоже нет ничего сложного, правда в отличие от SimpleXML совсем не элегантно. Продемонстрирую пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
$url = 'rss.xml'; //адрес RSS ленты $xml = xml_parser_create(); //создаёт XML-разборщик xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); //устанавливает опции XML-разборщика xml_parse_into_struct($xml, file_get_contents($url), $element, $index); //разбирает XML-данные в структуру массива xml_parser_free($xml); //освобождает XML-разборщик $count = count($index["TITLE"])-1; //число проходов цикла. for ($i=0; $i $count; $i++) { echo ''
.$element[$index["TITLE"][$i+1]]["value"].''; //выводим на печать заголовок статьи echo $element[$index["DESCRIPTION"][$i+1]]["value"]; //выводим на печать текст статьи } ?>
Вот таким образом мы получаем интересующие нас содержимое элементов RSS. Но тут уже нужно разобраться с массивами которые создает XML разборщик.
Способ 3 – Написать RSS парсер самому
Например я делал именно так, когда не знал про существование SimpleXML и XML Parser Functions. Приведу небольшой пример парсинга RSS обычным процедурным PHP кодом, тут за парсинг отвечает функция preg_match_all(), которая выполняет глобальный поиск шаблона в строке. Данный пример не совершенен и парсит только титлы и дескрипшены у RSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$url = 'rss.xml'; //адрес RSS ленты $rss = @file_get_contents($url); //получаем содержимое RSS лент в виде одной строки if ($rss) { preg_match_all("/title>[^>]+>/", $rss, $title); //парсим титлы preg_match_all("/[^/" , $rss, $description); //парсим дескрипшены $count = count($title[0])-1; //число проходов цикла. for ($i=0; $i $count; $i++) { echo ''
.substr($title[0][$i+1], 6, -8).''; //выводим на печать заголовок статьи echo substr($description[0][$i], 13, -14); //выводим на печать текст статьи } } else { echo 'Ошибка парсинга '.$url.''; //выводим ошибку если file_get_contents() вернула false } ?>
Таким же способом можно и отпарсить остальные элементы RSS ленты, главное написать правильно регулярку.
На этих трех способах мы и остановимся, еще есть наверняка множество сторонних скриптов и классов в PHP для парсинга XML, например magpieRSS у которого проблемы с кодировкой при парсинге и решить ее у меня не получилось, да собственно не очень то и хотелось, когда есть SimpleXML и XML Parser Functions. Вот кстати о проблемах с кодировкой мы сейчас и поговорим…
Проблемы с кодировкой
RSS ленты как правило находятся в кодировке UTF-8, при парсинге русского текста тремя способами описанными выше, нам на экран выводятся кракозябры. Все потому, что тест к нам приходит в кодировке UTF-8. Для того что бы вывести нормальные РУССКИЕ буквы нужно перекодировать спарсеный текст из кодировки UTF-8 в Windows-1251. Для этих целей в PHP существует функция iconv(), но она доступна не на всех серверах и чтобы избежать дальнейших проблем с вашим RSS парсером советую использовать самописную функцию перекодировки. Вникать в тонкости кодировок и разбираться как из одной кодировки получается другая думаю вам не хочется, так же не хотелось и мне. Немного погуглив я нашел замечательную функцию перекодировки из UTF-8 в Windows-1251 и обратно, предоставляет ее некий товарищ E64F. Возможно конечно он тоже ее где-то слямзил, но это не так важно, важно то что она мне очень понравилась по сравнению с другими нагуглеными функциями. Выкладываю функцию и пример ее использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
echo utf8_convert($str, "w"); //перекодирует $str из UTF-8 в Windows-1251 и выведет на экран { static $conv = ''; if (!is_array($conv)) { $conv = array(); for ($x=128; $x 143; $x++) { $conv['utf'][] = chr(209) . chr($x); $conv['win'][] = chr($x + 112); } for ($x=144; $x 191; $x++) { $conv['utf'][] = chr(208) . chr($x); $conv['win'][] = chr($x + 48); } $conv['utf'][] = chr(208) . chr(129); $conv['win'][] = chr(168); $conv['utf'][] = chr(209) . chr(145); $conv['win'][] = chr(184); } if ($type == 'w') { return str_replace($conv['utf'], $conv['win'], $str); } elseif ($type == 'u') { return str_replace($conv['win'], $conv['utf'], $str); } else { return $str; } } ?>
Функция utf8_convert() принимает 2 параметра: $str – наша строка которую нужно перекодировать и $type – в какую кодировку нужно кодировать (“w” – из utf в win, “u” – из win в utf). Как это применить к нашим 3-м способам парсинга RSS думаю разберетесь, если хоть немного знаете PHP.
Вот на этом пожалуй и закончим. Удачного парсинга !