powertools/html5

PHP PowerTools HTML5 组件

dev-master / 1.0.x-dev 2016-04-07 18:07 UTC

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-phphtml5lib/html5lib-php的原作者表达无尽的感激之情。他们的名字在我从Masterminds/html5-php借用的类代码中得到了认可。

作者