sebastiansulinski/path-extractor

解析HTML文档并从图片、锚点和其他标签中提取路径。

v2.0.0 2023-01-04 12:48 UTC

This package is auto-updated.

Last update: 2024-09-04 16:26:41 UTC


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类实例的数组,这些实例具有可用的srcalt属性。

提取锚点

要提取所有锚点,请使用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类实例的数组,这些实例具有可用的hreftargettitlenodeValue属性。

提取脚本

要提取所有脚本,请使用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类实例的数组,这些实例具有可用的srcasyncdefer属性 - 最后两个根据它们是否存在设置为布尔值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));