lorenzoferrarajr/lfj-dehydrator

LfjDehydrator 是一个使用 PHP 加速从文本中提取数据的工具

v0.0.1 2014-08-26 15:58 UTC

This package is not auto-updated.

Last update: 2024-09-28 14:49:37 UTC


README

由 Lorenzo Ferrara Junior 创建

Build Status

介绍

LfjDehydrator 是一个使用 PHP 加速从文本中提取数据的工具。请注意,本项目的某些部分可能会发生变化。

安装

LfjDehydrator 可以通过 composer 安装,将 "lorenzoferrarajr/lfj-dehydrator": "dev-master" 添加到 composer.json 文件中或运行

php composer.phar require lorenzoferrarajr/lfj-dehydrator:dev-master

用法

为了说明基本用法,请参考以下代码

<?php

use Lfj\Dehydrator\Dehydrator;
use Lfj\Dehydrator\Content\Content;
use Zend\Uri\Uri;

include "../vendor/autoload.php";

$url = new Uri('http://www.youtube.com/watch?v=tfw0KapQ3qw');
$html = file_get_contents($url->toString());
$content = new Content($html);

$dehydrator = new Dehydrator();

$dehydrator->addPlugin('MyDehydratorPlugin\YouTubeTitlePlugin');

$result = $dehydrator->dehydrate($url, $content)->getResult();

print_r($result);

Dehydrator 对象将实际的数据提取操作委托给插件。插件通过 ::addPlugin() 方法添加,并且仅在调用 ::dehydrate() 方法时逐个实例化。在之前的代码中使用的 YouTubeTitlePlugin 插件如下。

插件

插件包含从内容中提取数据的代码。每个插件必须实现 Lfj\Dehydrator\Plugin\PluginInterface。大部分无聊的代码可以通过扩展 Lfj\Dehydrator\Plugin\AbstractPlugin 类来省略。

需要实现的重要方法是

  • getKey() 必须返回一个字符串,表示存储插件提取数据的数组键
  • isEnabled() 必须返回 'true' 或 'false',表示插件是否应该被使用。例如,可以创建一个插件来从特定的网站提取数据,并使用 isEnabled() 检查当前 URL 是否正确
  • run() 应从内容中提取数据并填充结果

通常,具有相同键的两个插件的最终结果会附加到最终结果中。例如,可以有两个插件具有返回 title::getKey() 方法。一个插件从 <head> 中的 <title> 标签中提取文本,另一个插件从 content 属性中的 <meta property="og:title"> 标签中提取文本。Dehydrator 类的最终结果将类似于以下内容

array(
    'title' => array(
           0 => 'title from title tag',
           1 => 'title from og:title'
    )
)

以下是一个示例插件,它从 YouTube URL 中提取 YouTube 视频的标题

<?php

namespace MyDehydratorPlugin;

use Lfj\Dehydrator\Plugin\AbstractPlugin;
use Lfj\Dehydrator\Plugin\PluginInterface;

class YouTubeTitlePlugin extends AbstractPlugin implements PluginInterface
{
    public function getKey()
    {
        return 'title';
    }

    public function run()
    {
        $xml = new \DOMDocument();
        $xml->loadHTML($this->getContent()->toString());

        $h1 = $xml->getElementById('watch-headline-title');

        $title = trim(str_replace("\n", '', $h1->nodeValue));

        $this->setResult($title);
    }

    public function isEnabled()
    {
        switch ($this->getUrl()->getHost())
        {
            case 'www.youtube.com':
            case 'youtube.com':
            case 'youtu.be':
                return true;
        }

        return false;
    }
}

添加插件

Dehydrator::addPlugin 方法接受一个字符串作为第二个参数,表示插件类型。目前支持两种类型的插件:replaceablenull(对于不可替换)。

作为 replaceable 添加的插件的输出将替换具有相同 key 的插件的输出。这意味着如果两个插件正在提取页面的标题,并且返回相同的键,如果作为不可替换添加,则结果将类似于以下内容

ArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [title] => Array
                (
                    [0] => Chaplin Modern Times - Factory Scene (HD - 720p)
                    [1] => Chaplin Modern Times - Factory Scene (HD - 720p)
                )

        )
)

如果作为 replaceable 添加,第二个插件的输出将替换第一个插件的输出

ArrayIterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [title] => Chaplin Modern Times - Factory Scene (HD - 720p)
        )

)