dlindberg / dom-document-factory
简单的DOMDocument工厂,具有HTML净化和字符串输出功能
Requires
- php: ^7.2
- ext-dom: *
- ext-libxml: *
- ezyang/htmlpurifier: ^4.10
Requires (Dev)
- phpunit/phpunit: ^8.0
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-14 05:34:09 UTC
README
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
当前的测试相当基础;更有效地攻击可能的边缘情况或意外/不可预测行为的测试将是有帮助的。
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT。
安全性
如果您发现任何与安全相关的问题,请通过电子邮件 dane@lindberg.xyz 而不是使用问题跟踪器。
致谢
此项目的模板基于 The League of Extraordinary Packages 的 Skeleton 软件包仓库。
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。