benkle/feed-parser

基于规则的 RSS 和 Atom 解析器

2.1.0 2017-09-12 18:33 UTC

This package is not auto-updated.

Last update: 2024-09-15 03:49:48 UTC


README

这个 PHP 库包含一个可扩展的基于规则的 RSS 和 Atom 新闻源解析器。它的工作方式受到 Alex Debril 的 feed-io 的启发,但它从头开始重写,使其更干净、更易于扩展。它没有所有原始功能,但您可以轻松创建新的解析标准或扩展现有的标准,而无需翻阅库代码。

需求

安装

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.0
  • RSS09Standard 用于 RSS 0.9
  • RSS10Standard 用于 RSS 1.0
  • RSS20Standard 用于 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 移动到实用程序包中。