
Workflow de GitHub Actions en sandbox para la reproducción de CVE-2025-46820
Construido sobre el DOMDocument nativo de PHP, este proyecto proporciona acceso a APIs DOM modernas, tal y como esperarías al trabajar con código del lado del cliente en el navegador.
Realizar manipulación del DOM en tu código del lado del servidor mejora la forma en que se pueden construir páginas dinámicas. Utilizar una interfaz orientada a objetos estandarizada significa que la página puede procesarse previamente, beneficiando a navegadores, servidores web y redes de distribución de contenido.
Nota importante: el ejemplo que se muestra aquí tiene fines ilustrativos, pero usar el DOM para asignar datos directamente a los valores de los elementos acopla estrechamente la lógica a la vista, lo que se considera una mala práctica. Consulta la biblioteca DomTemplate para una solución más robusta para vincular datos al DOM.
Considera una página con un formulario, con un elemento de entrada para introducir tu nombre. Cuando se envía el formulario, la página debería saludarte por tu nombre.
Este es un ejemplo sencillo de cómo los archivos HTML de origen pueden tratarse como plantillas. Esto puede aplicarse fácilmente a páginas de plantilla más avanzadas para proporcionar contenido dinámico, sin requerir técnicas no estándar como {{llaves curvas}} para marcadores de posición, o la construcción de HTML propensa a errores echo '<div class='easy-mistake'>' . $content['opa'] . '</div>' desde PHP.
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 representa todas las especificaciones de HTMLElement, como HTMLAnchorElement (<a>), HTMLButtonElement (<button>), HTMLInputElement (<input>), HTMLTableSectionElement (<thead>, <tbody>, <tfoot>), etc. El tipo particular puede detectarse con Element::getElementType(), que devuelve uno de los valores del enum ElementType.DOMException para capturar diferentes tipos de excepciones, como EnumeratedValueException, HierarchyRequestError, IndexSizeException, etc.FileList, StyleSheet, VideoTrackList, WindowProxy, etc.Element::querySelector() y (Element::querySelectorAll())ClassListElement::previousElementSibling, Element::nextElementSibling, Element::children y Element::lastElementChild y firstElementChild, etc.HTMLDocument:
Este repositorio tiene como objetivo ser lo más preciso posible con la especificación DOM en https://dom.spec.whatwg.org/ - a partir de la v4.0.0 toda la funcionalidad está implementada con las siguientes desviaciones menores pero inevitables del estándar:
tagName de los elementos está en mayúsculas.HTMLElement, debe llamarse a Element::getElementType() - no hay subclases de Element disponibles para usar con instanceof, por ejemplo.HTMLInputElement::files devuelve un FileList que enumera todos los archivos seleccionados por el usuario a través de la interfaz del navegador. Este tipo de funcionalidad es imposible de implementar en el lado del servidor, pero se ha simulado para mantener la coherencia con la especificación. Intentar usar funcionalidad del lado del cliente dentro de esta biblioteca lanza una ClientSideOnlyFunctionalityException.Este repositorio tiene como objetivo ser lo más preciso posible con la especificación DOM. Una extensión del repositorio está disponible en https://php.gt/domtemplate que añade plantillas de página y vinculación de datos mediante elementos personalizados y atributos de plantilla, introduciendo funcionalidad del lado del servidor similar a la de WebComponents.
Desde el lanzamiento de PHP 8.4, hay una nueva clase nativa HTMLDocument incluida en PHP de forma nativa. Al tener enlaces nativos, todas las operaciones son mucho más rápidas. Se ha comenzado el trabajo para que la implementación de Dom de PHPGT utilice el nuevo código nativo. Afortunadamente, el DOM es un estándar muy bien definido, así que pase lo que pase, se requerirán cambios mínimos o nulos en tu código.
Echa un vistazo a los benchmarks en la rama php84-benchmark por ti mismo: la mayoría de las operaciones registran un aumento de velocidad del 90% o más al cambiar a la implementación nativa.
Se proporcionará más información en el readme cuando se haya avanzado más hacia una implementación de las clases nativas.