lorenzoferrarajr / lfj-dehydrator
LfjDehydrator 是一个使用 PHP 加速从文本中提取数据的工具
Requires
- php: >=5.3
- zendframework/zend-uri: 2.2.*
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-28 14:49:37 UTC
README
由 Lorenzo Ferrara Junior 创建
介绍
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 方法接受一个字符串作为第二个参数,表示插件类型。目前支持两种类型的插件:replaceable 和 null(对于不可替换)。
作为 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) ) )