benkle / feed-parser
基于规则的 RSS 和 Atom 解析器
Requires
- php: >=5.6.0
- benkle/feed-interfaces: ^1.1
- masterminds/html5: ^2.2
- psr/log: ^1.0
Requires (Dev)
- phpunit/phpunit: ^5.3
Suggests
- monolog/monolog: For logging
This package is not auto-updated.
Last update: 2024-09-15 03:49:48 UTC
README
这个 PHP 库包含一个可扩展的基于规则的 RSS 和 Atom 新闻源解析器。它的工作方式受到 Alex Debril 的 feed-io 的启发,但它从头开始重写,使其更干净、更易于扩展。它没有所有原始功能,但您可以轻松创建新的解析标准或扩展现有的标准,而无需翻阅库代码。
需求
- PHP 5.6+
- masterminds/html5 2.2+
- psr/log 1.0+
安装
FeedParser 可以通过 composer 以通常的方式包含
composer require benkle/feed-parser
使用
为了快速入门,您可以实例化类 \Benkle\FeedParser\Reader 并直接获取一个源
$reader = new \Benkle\FeedParser\Reader(); $feed = $reader->read(file_get_contents('http://xkcd.com/atom.xml')); echo $feed->getTitle() . PHP_EOL; foreach ($feed->getItems() as $item) { echo "\t" . $item->getTitle() . PHP_EOL; }
创建自己的规则
FeedParser 基于“规则”,这些规则按标准组织。
一个规则可以是任何实现 \Benkle\FeedParser\Interfaces\RuleInterface 的类
class MyRule implements \Benkle\FeedParser\Interfaces\RuleInterface { public function canHandle(\DOMNode $node, \Benkle\FeedParser\Interfaces\NodeInterface $target) { return $node->nodeName == 'title' && $target instanceof \Benkle\FeedParser\Interfaces\ChannelInterface; } public function handle(\Benkle\FeedParser\Parser $parser, \DOMNode $node, \Benkle\FeedParser\Interfaces\NodeInterface $target) { /** \Benkle\FeedParser\Interfaces\ChannelInterface $target */ $target->setTitle($node->nodeValue); } }
规则可以通过其规则集添加到任何标准,规则集是一个按优先级排序的列表
/** @var \Benkle\FeedParser\Interfaces\StandardInterface $standard */ foreach ($reader->getStandards() as $standard) { $standard->getRules()->add(new MyRule(), 5); // Rules are ordered by priority }
但通常您可能希望将所有规则聚合在一个标准中。标准是实现 \Benkle\FeedParser\Interfaces\StandardInterface 的类
class MyStandard implements \Benkle\FeedParser\Interfaces\StandardInterface { use \Benkle\FeedParser\Traits\WithParserTrait; use \Benkle\FeedParser\Traits\WithRuleSetTrait; public function __construct() { $this->getRules()->add(new MyRule(), 5); } public function newFeed() { return new \Benkle\FeedParser\Feed(); } public function getRootNode(\DOMDocument $dom) { return $dom->getElementsByTagName('feed')->item(0); } public function canHandle(\DOMDocument $dom) { return $dom->getElementsByTagName('feed')->length > 0; } }
将标准添加到 Reader 与将规则添加到标准一样简单
$reader->getStandards()->add(new MyStandard(), 5);
包含的标准包括
Atom10Standard用于 Atom 1.0RSS09Standard用于 RSS 0.9RSS10Standard用于 RSS 1.0RSS20Standard用于 RSS 2.0
设置自己的 DOM 解析器
这个库使用 PHP DOM 类库进行 XML 遍历。要使用您自己的库,您必须编写一个包装器,该包装器实现 \Benkle\FeedParser\Interfaces\DOMParserInterface
$reader->setDomParser(new class implements \Benkle\FeedParser\Interfaces\DOMParserInterface { public function parse($source) { $parser = new \MyFancy\DomParser(); return $parser->parse($source); } });
FeedParser 已经包含了一个包装器,用于标准库,它速度快,但在源不是有效的 XML 时会失败,以及用于 Masterminds HTML5 解析器,它更容错,但速度也慢得多。它还包括一个元包装器,它将尝试任何数量的其他包装器,让您在速度和可靠性之间取得平衡
$reader->setDomParser( new \Benkle\FeedParser\DOMParsers\FallbackStackParser( new \Benkle\FeedParser\DOMParsers\PHPDOMParser(), new \Benkle\FeedParser\DOMParsers\MastermindsHTML5Parser() ) );
注意: 此包装器实现了 Psr\Log\LoggerAwareInterface,并将在任何其保护程序抛出异常时写入通知!
更多控制
如果您需要更多控制加载哪些标准,并且不需要文件和 http 访问,则可以使用 \Benkle\FeedParser\BareReader 类
$reader = new \Benkle\FeedParser\BareReader(); $reader->setDomParser(new \Benkle\FeedParser\DOMParsers\PHPDOMParser()); $reader->getStandards()->add(new \Benkle\FeedParser\Standards\RSS\RSS20Standard());
待办事项
- 已将包含的类
PriorityList移动到实用程序包中。