powertools / html5
PHP PowerTools HTML5 组件
dev-master / 1.0.x-dev
2016-04-07 18:07 UTC
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-09-18 19:04:15 UTC
README
PHPPowertools 是一个适用于 PHP >= 5.4 的 Web 应用程序框架。
PHPPowertools/HTML5 是 PHPPowertools 已发布到公共领域的第四个组件。
此项目为 PHP 提供了一个 HTML5 解析器。它最初是 Masterminds/html5-php 的分支,而 Masterminds/html5-php 本身又是 html5lib/html5lib-php 的分支。
特性
- HTML5 序列化器
- 基于事件的(类似 SAX)解析器
- DOM 树构建器
示例用法
namespace App; use \PowerTools\HTML5 as HTML5; // An example HTML document: $html = <<< 'HERE' <html> <head> <title>TEST</title> </head> <body id='foo'> <h1>Hello World</h1> <p>This is a test of the HTML5 parser.</p> </body> </html> HERE; // Parse the document. $dom is a DOMDocument. $html5 = new HTML5(); $dom = $html5->loadHTML($html); // Render it as HTML5: print $html5->saveHTML($dom); // Or save it to a file: $html5->save($dom, 'out.html');
解析器创建的 $dom
是一个完整的 DOMDocument
对象。而 save()
和 saveHTML()
方法将接受任何 DOMDocument。
选项
在加载 HTML5 文档时,可以传递一个配置选项数组。
// An associative array of options $options = array( 'option_name' => 'option_value', ); // Provide the options to the constructor $html5 = new HTML5($options); $dom = $html5->loadHTML($html);
支持以下选项
encode_entities
(布尔值): 表示序列化器应积极地将字符编码为实体。没有此选项,它只编码最基本的部分。disable_html_ns
(布尔值): 阻止解析器自动将 HTML5 命名空间分配给 DOM 文档。这是为非命名空间感知的 DOM 工具。target_document
(\DOMDocument): 将用作解析节点目的地的 DOM 文档。implicit_namespaces
(数组): 应由解析器使用的命名空间的关联数组。名称是标签前缀,值是 NS URI。
低级 API
此库提供了以下低级 API,您可以使用它们创建更定制的 HTML5 工具
- 一个
InputStream
抽象,可以与不同类型的输入源(不仅仅是文件和字符串)一起工作。 - 一个类似 SAX 的基于事件的解析器,您可以将其钩入以进行特殊类型的解析。
- 一个灵活的错误报告机制,可以调整以进行文档语法检查。
- 一个使用 PHP 内置 DOM 库的 DOM 实现。
解析器设计
解析器设计如下
InputStream
部分处理直接 I/O。Scanner
代表解析器进行扫描。Tokenizer
从扫描器请求数据,解析它,分类它,并将其发送到EventHandler
。它是一个 递归下降解析器。EventHandler
接收关于在标记化期间发生的每个特定语义事件的通告和数据。DOMBuilder
是一个EventHandler
,它侦听标记化事件并根据事件构建一个文档树(DOMDocument
)。
序列化器设计
序列化器将数据结构(DOMDocument
)转换为字符表示形式——一个 HTML5 文档。
序列化器分为三个部分
OutputRules
包含将 DOM 元素转换为字符串的规则。规则是实现RulesInterface
接口的一种实现,允许使用不同的规则集。Traverser
是一个专用树遍历器。它访问树中的每个节点并使用OutputRules
将节点转换为字符串。- HTML5管理
Traverser
并将在正确位置存储结果数据。
序列化器(save()
,saveHTML()
)遵循HTML 5.0规范的第8.9节。因此,标签是按照这些规则序列化的
- 包含子标签的标签:<foo>子标签</foo>
- 不能包含内容的标签:<foo>(没有闭合标签)
- 可能包含内容但不包含内容的标签:<foo></foo>
已知问题
- 命名空间:HTML5只支持所选列表的命名空间,并且它们不以与XML命名空间相同的方式操作。一个
:
没有特殊意义。默认情况下,解析器不支持通过:
的XML样式命名空间;要启用XML命名空间,请参阅XML命名空间部分 - 脚本:此解析器不包含JavaScript或CSS解释器。虽然可以提供,但并非所有功能都将得到支持。
- 重入:当前的解析器不是重入的。(因此,您不能在解析过程中暂停解析以修改HTML字符串。)
- 验证:当前的树构建器不是验证解析器。它将纠正一些HTML,但不会检查HTML是否符合标准。(如果您愿意,可以通过扩展DOMTree或构建自己的EventHandler实现来构建验证解析器。)
- 对插入模式的支持有限。
- 某些自动纠正是自动完成的。
- 根据规范,许多遗留标签被接受并正确处理,即使它们在技术上不是HTML5的一部分。
- 属性名称和值:由于PHP实现DOM的实现细节,不符合XML 1.0标准的属性名称不会被插入到DOM中。(实际上,它们被忽略。)如果您有针对此问题的聪明解决方案,请加入我们!
- 处理器指令:HTML5规范不允许处理器指令。我们允许。由于这是一个服务器端库,我们认为这很有用。这意味着,亲爱的读者,在某些情况下,您可以从混合PHP/HTML文档中解析HTML。然而,这只是一个辅助功能,而不是核心功能。
- HTML清单:不受支持。
- PLAINTEXT:不受支持。
- 采用机构算法:尚未实现。(8.2.5.4.7)
XML命名空间
要使用XML样式命名空间,您必须正确配置主要的HTML5
实例。
use Masterminds\HTML5; $html = new HTML5(array( "xmlNamespaces" => true )); $dom = $html->loadHTML('<t:tag xmlns:t="http://www.example.com"/>'); $dom->documentElement->namespaceURI; // http://www.example.com
您还可以添加一些默认前缀,这些前缀不需要命名空间声明,但它们将是命名空间元素。
use Masterminds\HTML5; $html = new HTML5(array( "implicitNamespaces"=>array( "t"=>"http://www.example.com" ) )); $dom = $html->loadHTML('<t:tag/>'); $dom->documentElement->namespaceURI; // http://www.example.com
感谢...
向Masterminds/html5-php和html5lib/html5lib-php的原作者表达无尽的感激之情。他们的名字在我从Masterminds/html5-php借用的类代码中得到了认可。