sebastiansulinski / path-extractor
解析HTML文档并从图片、锚点和其他标签中提取路径。
Requires
- php: ^8.1
- ext-dom: *
- ext-tidy: *
Requires (Dev)
- phpunit/phpunit: ^9.5
README
包,可以从提供的HTML的图片、锚点和其他标签中提取路径和属性。
安装
composer require sebastiansulinski/path-extractor
基本用法
实例化
您可以通过使用new
关键字或静态make
方法来实例化Extractor
。构造函数接受一个可选参数,表示要解析的字符串。
use SSD\PathExtractor\Extractor; $extractor = new Extractor; $extractor = new Extractor($html); $extractor = Extractor::make(); $extractor = Extractor::make($html);
指定输入HTML
除了可以通过构造函数传递字符串外,您还可以使用Extractor::for
方法将字符串设置在实例上。
$extractor = new Extractor; $extractor->for($html);
提取图片
要提取所有图片,请使用Extractor::extract(Image::class)
方法。
use \SSD\PathExtractor\Tags\Image; $html = '<img src="/media/image.jpg" alt="My image">'; $html = .'<img src="/media/image2.png" alt="My image 2">'; $images = Extractor::make($html)->extract(Image::class);
上面的代码将返回一个包含\SSD\PathExtractor\Tags\Image
类实例的数组,这些实例具有可用的src
和alt
属性。
提取锚点
要提取所有锚点,请使用Extractor::extract(Anchor::class)
方法。
use \SSD\PathExtractor\Tags\Anchor; $html = '<a href="/media/files/one.pdf" target="_blank">Document one</a>'; $html = .'<a href="/media/files/two.docx" title="Word document">Word document</a>'; $anchors = Extractor::make($html)->extract(Anchor::class);
上面的代码将返回一个包含\SSD\PathExtractor\Tags\Anchor
类实例的数组,这些实例具有可用的href
、target
、title
和nodeValue
属性。
提取脚本
要提取所有脚本,请使用Extractor::extract(Script::class)
方法。
use \SSD\PathExtractor\Tags\Script; $html = '<script src="/media/script/one.js" async></script>'; $html = .'<script src="/media/script/two.js" async defer></script>'; $html = .'<script src="/media/script/three.js"></script>'; $scripts = Extractor::make($html)->extract(Script::class);
上面的代码将返回一个包含\SSD\PathExtractor\Tags\Script
类实例的数组,这些实例具有可用的src
、async
和defer
属性 - 最后两个根据它们是否存在设置为布尔值true
/ false
。
限制扩展名
有时您可能只想提取具有特定扩展名的图片或锚点。为此,请使用Extractor::withExtensions()
方法并传递所需的扩展名作为参数。
$images = Extractor::make($html)->withExtensions('jpg')->extract(Image::class); $anchors = Extractor::make($html)->withExtensions(['pdf', 'docx'])->extract(Anchor::class); $anchors = Extractor::make($html)->withExtensions('pdf', 'docx')->extract(Anchor::class);
预置URL
有时您可能希望将协议、域名甚至端口预置到从HTML提取的相对路径中。为此,请使用Extractor::withUrl()
方法。
$html = '<img src="/media/image.jpg" alt="My image">'; $html .= '<img src="https://ssdtutorials.com/media/image2.jpg" alt="My image 2">'; $images = Extractor::make($html)->withUrl('https://mywebsite.com')->extract(Image::class);
上面的代码将返回一个包含两个\SSD\PathExtractor\Tags\Image
实例的数组 - 一个将src
设置为https://mywebsite.com/media/image.jpg
,另一个设置为https://ssdtutorials.com/media/image2.jpg
。请注意 - 它不会替换已包含协议和域名的路径。
整理/净化输入
如果您想先净化您的输入,可以使用Extractor::withTidy()
方法。此方法接受两个可选参数:array $config = []
,允许您覆盖默认的tidy
扩展配置,以及string $encoding = 'utf8'
,如果您需要更改编码。
默认配置设置为
[ 'clean' => 'yes', 'output-html' => 'yes', 'wrap' => 0, ]
有关配置选项的更多信息,请参阅HTML Tidy配置选项。
无效输入异常
如果您决定不使用tidy
来净化您的输入,例如在将HTML传递给构造函数或for
方法之前这样做,并且提供的HTML包含无效语法,将抛出\SSD\PathExtractor\InvalidHtmlException
- 因此请确保捕获它并相应地处理。
访问\SSD\PathExtractor\Tags\Tag
类实例的属性。
\SSD\PathExtractor\Tags\Tag
的每个实现都将有其自己独特的属性集可用。
\SSD\PathExtractor\Tags\Anchor - href - target - title - rel - nodeValue (represents text in between opening and closing a tag) \SSD\PathExtractor\Tags\Image - src - alt - width - height \SSD\PathExtractor\Tags\Script - src - type - charset - async - defer \SSD\PathExtractor\Tags\Link - href - type - rel
渲染\SSD\PathExtractor\Tags\Tag
类实例的标签
一旦提取了资源集合,您就可以通过简单地将它转换为字符串或在它上面调用tag()
方法来为每个资源返回一个HTML标签。
$html = '<img src="/media/image.jpg" alt="My image">'; $html = .'<img src="/media/image2.png" alt="My image 2">'; $tag1 = (string)Extractor::make($html)->withExtensions('jpg')->extract(Image::class)[0]; $tag2 = Extractor::make($html)->withExtensions('jpg')->extract(Image::class)[0]->tag();
以上两种方法都将返回
<img src="/media/image.jpg" alt="My image">
您也可以通过在实例上调用 Tag::toArray()
方法来获取每个实例的数组表示。
Extractor::make($html)->withExtensions('jpg')->extract(Image::class)[0]->toArray()
添加更多标签类型
如果您需要更多标签类型,例如 link
,只需添加一个扩展 \SSD\PathExtractor\Tags\Tag
的新类,并实现它所需的抽象方法。
use SSD\PathExtractor\Tags\Tag; use SSD\PathExtractor\Tags\Type; class Link extends Tag { /** * Get tag name. * * @return string */ static public function tagName(): string { return 'link'; } /** * Get path attribute. * * @return string */ static public function pathAttribute(): string { return 'href'; } /** * Get available attributes. * * @return array */ static public function availableAttributes(): array { return [ 'href' => Type::STRING, 'type' => Type::STRING, 'rel' => Type::STRING, ]; } /** * Get formatted tag. * * @return string */ public function tag(): string { return '<link'.$this->tagAttributes('href', 'type', 'rel').'>'; } }
仅提取路径的示例
$string = '<img src="/media/image/one.jpg" alt="Image one">'; $string .= '<img src="https://mysite.com/media/image/two.jpg" alt="Image two">'; $string .= '<a href="/media/files/two.pdf" '. 'target="_blank" title="Document">Document</a>'; $string .= '<script src="/media/script/three.js" async></script>'; $string .= '<link href="/media/link/three.css" rel="stylesheet">'; $extractor = Extractor::make($string); $images = array_map(function (Tag $tag) { return $tag->path(); }, $extractor->extract(Image::class)); $anchors = array_map(function (Tag $tag) { return $tag->path(); }, $extractor->extract(Anchor::class)); $scripts = array_map(function (Tag $tag) { return $tag->path(); }, $extractor->extract(Script::class)); $links = array_map(function (Tag $tag) { return $tag->path(); }, $extractor->extract(Link::class)); $this->assertEquals([ '/media/image/one.jpg', 'https://mysite.com/media/image/two.jpg', '/media/files/two.pdf', '/media/script/three.js', '/media/link/three.css', ], array_merge($images, $anchors, $scripts, $links));