自动化研究产物 — 非上游项目。
本仓库是由自动化工具链为拉瓦尔大学(Université Laval)硕士论文构建的一次性实验环境,用于复现已发表的 GitHub Actions 工作流漏洞。它是
phpgt/Dom在提交b73d7e8b54963796132df99902c3224016511bb9(2025-03-21)时的逐字快照,依据该项目自身的许可证重新分发,该许可证文件已原样包含在本快照中。上游项目未参与其中,也从未成为攻击目标,此处研究的漏洞已公开。本仓库中的每个密钥和变量均为随机生成的虚拟值——不存在任何真实凭据。操作引用和运行器镜像均固定为其在 2025-03-21 解析到的版本;有关对快照所做的每项更改,请参阅工具链输出中的
pinning.md。如有疑问或异议:[email protected]
本项目构建于 PHP 原生 DOMDocument 之上,提供对现代 DOM API 的访问,如同您在浏览器中处理客户端代码时所期望的那样。
在服务端代码中执行 DOM 操作可增强动态页面的构建方式。利用标准化的面向对象接口,页面可以预先处理,从而使浏览器、Web 服务器和内容分发网络受益。
重要提示: 此处示例仅用于说明目的,但使用 DOM 直接将数据设置到元素的值会将逻辑与视图紧密耦合,这被视为不良实践。请参阅 DomTemplate 库以获取将数据绑定到 DOM 的更稳健的解决方案。
考虑一个包含表单的页面,其中有一个输入元素用于输入您的姓名。当表单提交时,页面应通过您的姓名向您问候。
这是一个简单的示例,说明如何将源 HTML 文件视为模板。这可以轻松应用于更高级的模板页面以提供动态内容,而无需使用非标准技术,例如 {{花括号}} 作为占位符,或 echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' 这种在 PHP 中容易出错的 HTML 拼接方式。
name.html)<!doctype html>
<h1>
你好,<span class="name-output">你</span>!
</h1>
<form>
<input name="name" placeholder="请输入您的姓名" required />
<button>提交</button>
</form>
index.php)<?php
use Gt\Dom\HTMLDocument;
use Gt\Dom\HTMLElement\HTMLSpanElement;
require "vendor/autoload.php";
$html = file_get_contents("name.html");
$document = new HTMLDocument($html);
if(isset($_GET["name"])) {
$span = $document->querySelector(".name-output");
$span->innerText = $_GET["name"];
}
echo $document;
Element 类型代表所有 HTMLElement 规范,例如 HTMLAnchorElement(<a>)、HTMLButtonElement(<button>)、HTMLInputElement(<input>)、HTMLTableSectionElement(<thead>、<tbody>、<tfoot>)等。特定类型可通过 Element::getElementType() 检测,该方法返回 ElementType 枚举值之一。DOMException 扩展用于捕获不同类型的异常,例如 、、 等。本仓库旨在尽可能准确地遵循 https://dom.spec.whatwg.org/ 上的 DOM 规范——自 v4.0.0 起,所有功能均已实现,但与标准存在以下微小且不可避免的偏差:
tagName 属性为大写。HTMLElement 类型,必须调用 Element::getElementType()——例如,没有可用于 instanceof 的 Element 子类。HTMLInputElement::files 返回一个 FileList,用于枚举用户通过浏览器界面选择的所有文件。此类功能无法在服务端实现,但已为与规范保持一致而进行了存根。在本库中尝试使用客户端功能会抛出 ClientSideOnlyFunctionalityException。本仓库旨在尽可能准确地遵循 DOM 规范。该仓库的扩展可在 https://php.gt/domtemplate 获取,它通过自定义元素和模板属性添加页面模板和数据绑定功能,引入类似 WebComponents 的服务端功能。
自 PHP 8.4 发布以来,PHP 原生内置了一个新的原生 HTMLDocument 类。由于具有原生绑定,所有操作都更快。已经开始着手使 PHPGT 的 Dom 实现利用新的原生代码。幸运的是,DOM 是一个非常明确的标准,因此无论发生什么,您的代码都只需极少或无需更改。
请自行查看 php84-benchmark 分支上的基准测试:大多数操作记录显示,切换到原生实现后速度提升了 90% 或更高!
当在原生类的实现方面取得更多进展时,自述文件中将提供更多信息。
EnumeratedValueExceptionHierarchyRequestErrorIndexSizeExceptionFileList、StyleSheet、VideoTrackList、WindowProxy 等类。Element::querySelector() 和 Element::querySelectorAll() 使用 CSS 选择器引用元素ClassList 添加/移除/切换元素的类Element::previousElementSibling、Element::nextElementSibling、Element::children、Element::lastElementChild 和 firstElementChild 等遍历仅包含元素的节点ChildNode::remove()、ChildNode::before、ChildNode::after、ChildNode::replaceWith() 插入和移除子节点