
GitHub Actions workflow песочница для воспроизведения CVE-2025-46820
Построенный на основе нативного DOMDocument из PHP, этот проект предоставляет доступ к современным DOM API, как вы могли бы ожидать при работе с клиентским кодом в браузере.
Выполнение DOM-манипуляций в серверном коде улучшает способы создания динамических страниц. Использование стандартизированного объектно-ориентированного интерфейса означает, что страница может быть обработана заранее, что приносит пользу браузерам, веб-серверам и сетям доставки контента.
Важное примечание: пример, показанный здесь, приведён в иллюстративных целях, но использование DOM для прямой установки данных в значения элементов тесно связывает логику с представлением, что считается плохой практикой. Пожалуйста, обратитесь к библиотеке DomTemplate для более надёжного решения по привязке данных к DOM.
Рассмотрим страницу с формой и полем ввода для ввода вашего имени. Когда форма отправлена, страница должна поприветствовать вас по имени.
Это простой пример того, как исходные HTML-файлы могут использоваться в качестве шаблонов. Это легко применить к более продвинутым страницам-шаблонам для предоставления динамического контента без использования нестандартных приёмов, таких как {{фигурные скобки}} для плейсхолдеров или подверженной ошибкам конструкции HTML из PHP, как echo '<div class='easy-mistake'>' . $content['opa'] . '</div>'.
name.html)<!doctype html>
<h1>
Hello, <span class="name-output">you</span> !
</h1>
<form>
<input name="name" placeholder="Your name, please" required />
<button>Submit</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 для перехвата различных типов исключений, таких как EnumeratedValueException, HierarchyRequestError, IndexSizeException и т.д.FileList, StyleSheet, VideoTrackList, WindowProxy и т.д.Element::querySelector() и (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children, Element::lastElementChild и firstElementChild и т.д.HTMLDocument:
Этот репозиторий стремится быть максимально точным по отношению к спецификации DOM на https://dom.spec.whatwg.org/ — начиная с версии v4.0.0 вся функциональность реализована со следующими незначительными, но неизбежными отклонениями от стандарта:
tagName элементов записано в верхнем регистре.HTMLElement необходимо вызывать Element::getElementType() — подклассы Element для использования с instanceof, например, недоступны.HTMLInputElement::files возвращает FileList, перечисляющий все файлы, выбранные пользователем через интерфейс браузера. Такую функциональность невозможно реализовать на серверной стороне, но она была заглушена для согласованности со спецификацией. Попытка использования клиентской функциональности в этой библиотеке вызывает ClientSideOnlyFunctionalityException.Этот репозиторий предназначен для максимально точного соответствия спецификации DOM. Расширение репозитория доступно на https://php.gt/domtemplate, которое добавляет шаблонизацию страниц и привязку данных через пользовательские элементы и атрибуты шаблонов, вводя серверную функциональность, подобную WebComponents.
Начиная с выпуска PHP 8.4, в PHP нативно появился новый класс HTMLDocument. Благодаря нативным привязкам все операции выполняются значительно быстрее. Начата работа по адаптации реализации Dom от PHPGT для использования нового нативного кода. К счастью, DOM — это очень хорошо определённый стандарт, поэтому что бы ни произошло, потребуется минимальное количество изменений или их отсутствие в вашем коде.
Взгляните сами на бенчмарки в ветке php84-benchmark: для большинства операций зафиксировано увеличение скорости на 90% и более при переходе на нативную реализацию!
Более подробная информация будет изложена в readme после того, как будет проделана дальнейшая работа по реализации нативных классов.