dlindberg/dom-document-factory

简单的DOMDocument工厂,具有HTML净化和字符串输出功能

1.0.0 2019-03-13 15:50 UTC

This package is auto-updated.

Last update: 2024-09-14 05:34:09 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

PHP中的DOMDocument扩展非常强大且非常有用,可以用于操作HTML。然而,恰好有足够的样板代码,一个简单的工具工厂可以使事情变得容易一些。我也发现,我经常想要做的是使用HTMLPurifier来清理一些陈旧的HTML输入,将其转换为DOMNode,操作它,然后将其转换回字符串。这是一个简单的工厂,有助于此工作流程。它接受包含HTML片段的字符串,净化它,并将其转换为 DOMNode。在将字符串返回的过程中也有一些简单的样板代码,因此它可以处理这一点——可选地使用HTMLPurifier的不同传递方式(不经常需要,但有时有帮助)。

此工厂设置得如此简单,您只需初始化并调用它,就可以得到一个DOMNode。按照您的需求操作DOM,然后将DOMNode转换回字符串。当然,默认设置很好,但灵活性很重要。因此,您可以注入DOCFactoryConfig来调整所需的设置——如果您因为用例而需要实现工厂,这很有用。

安装

通过Composer

$ composer require dlindberg/DOMDocumentFactory

用法

基本调用

如果您真正需要做的只是取一个HTML字符串并从中快速获得一个可用的DOMNode,您可以使用简单地创建DOMDocumentFactory类的实例并调用它。

$html = '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>'; // Etc. Etc.

$docFactory = new dlindberg\DOMDocumentFactory();

$DOMNode = $docfactory($html);

/* Do something with your DOMNodes */

echo $docFactory->stringify($DOMNode->firstChild);

对于输入<p>这是一些文本</p>,如果没有对您的DOMNode进行进一步修改,则结果也将是<p>this is some text</p>

或者,有另外两种调用工厂的方法。 getNode(string $blob)getDocument(string $blob)getNode 方法执行与调用类相同的事情,并返回片段中的 body。使用 getDocument 将返回整个 DOMDocument 类。请注意,即使使用 getNode 方法,也可以通过使用DOMDocument的 ownerDocument 方法访问父DOMDocument。

如果您有一段HTML具有多个直接子节点,例如

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>In vel nibh eget turpis sagittis posuere ut vitae purus.<p>
<p>Donec in libero mauris. Aenean eu consectetur tortor.</p>
<p>Sed dolor neque, maximus et est eu, ultricies interdum libero.</p>
<p>Cras sed feugiat ante. Suspendisse ultrices eros at arcu feugiat dictum.</p>

只需使用

$DOMElement = $docfactory($html);
echo $docfactory->stringify($DOMElement->firstChild);

将得到

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>

使用

echo $docfactory->stringify($DOMElement);

将得到

<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>In vel nibh eget turpis sagittis posuere ut vitae purus.<p>
<p>Donec in libero mauris. Aenean eu consectetur tortor.</p>
<p>Sed dolor neque, maximus et est eu, ultricies interdum libero.</p>
<p>Cras sed feugiat ante. Suspendisse ultrices eros at arcu feugiat dictum.</p>
</body>

要获取与输入相同的内容,可以使用 stringifyFromList 方法。此方法返回一个包含NodeList中每个子节点的字符串数组。如果您需要它们作为数组,可以直接使用。或者,您可以使用 implode 将数组扁平化。

echo \implode(\PHP_EOL, $docfactory->stringifyFromList($DOMElement));

自定义调用

有时您想做一些更复杂的事情,因此DOMDocumentFactory类的构造函数可以接受一个DOMDocumentFactoryConfig类的实例作为其唯一参数。

要创建DOMDocumentFactoryConfig的实例

$DOMDocumentFactoryConfig = new DOMDocumentFactoryConfig(array $settings = [], \HTMLPurifier $inputPurifier = null, \HTMLPurifier $outputPurifier = null);

如果您没有传递 HTMLPurifier 的实例作为 $inputPurifier,则将使用HTMLPurifier的设置,而不是默认的HTMLPurifier对象。默认情况下,不执行输出净化。如果您想进行输出净化,可以传递一个额外的HTMLPurifier作为 $outputPurifier

创建后还可以修改配置

$DOMDocumentFactoryConfig->setInputPurifier(\HTMLPurifier $purifier);
$DOMDocumentFactoryConfig->setOutputPurifier(\HTMLPurifier $purifier);
$DOMDocumentFactoryConfig->version = '1.0';

$settings 数组默认为

$settings = [
    'version'             => '1.0',
    'encoding'            => 'UTF-8',
    'recover'             => true,
    'preserveWhiteSpace'  => false,
    'formatOutput'        => true,
    'DOMOptions'          => LIBXML_NOERROR | LIBXML_NOWARNING,
];

作为静态函数

您还可以将此工厂作为一次性的静态函数使用。在这种情况下,您可以提供可选的 $DOMDocumentFactoryConfig。内部,静态方法将启动 DOMDocumentFactory 类的实例来完成其工作,因此这种使用方法主要是将工厂集成到项目中的快捷方式。

$node = DOMDocumentFactory::getDomNode(string $blob, DOMDocumentFactoryConfig $config = null);

$string = DOMDocumentFactory::stringifyNode(\DOMNode $node, DOMDocumentFactoryConfig $config = null);

$array = DOMDocumentFactory::stringifyNodeList(\DOMNodeList $nodes, DOMDocumentFactoryConfig $config = null);

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

测试

$ composer test

当前的测试相当基础;更有效地攻击可能的边缘情况或意外/不可预测行为的测试将是有帮助的。

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全性

如果您发现任何与安全相关的问题,请通过电子邮件 dane@lindberg.xyz 而不是使用问题跟踪器。

致谢

此项目的模板基于 The League of Extraordinary PackagesSkeleton 软件包仓库。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件