Поддержка HTML 5 в PHP 8.4
\DOMDocument
, который теоретически должен поддерживать HTML 4, но на самом деле он уже не совместим с HTML 4.Итак, это классика PHP — верно 😅? Что ж, можно смеяться сколько угодно, но давайте уделим время новым функциям, которые — пусть и с опозданием — исправляют эти причуды: PHP 8.4 добавляет парсер, совместимый с HTML 5! В этой статье я расскажу об основных особенностях этого нового парсера, и вы также можете прочитать со мной весь RFC:
Обратная совместимость
Одним из основных требований к новому парсеру является его полная обратная совместимость. Именно поэтому разработчики решили создать совершенно новый класс — в новом пространстве имён — для размещения нового парсера HTML 5. Старый класс \DOMDocument
оставлен (в основном) в покое. Единственное изменение в старой реализации заключается в том, что \DOMDocument
теперь расширяет абстрактный класс \Dom\Document
, который также является родителем для новой, совместимой с HTML 5 реализации: \Dom\HTMLDocument
.
Если необходимо использовать новый парсер HTML 5 в PHP, то вам нужен именно он:
// Совместимость с HTML 5
$dom = \Dom\HTMLDocument::createFromString($html);
Старая версия по-прежнему доступна:
// Поддержка HTML 4
$oldDom = new \DOMDocument();
$oldDom->loadHTML($html);
Создание DOM
Одно из ключевых отличий, которое бросается в глаза, заключается в том, что новая реализация полагается на статические конструкторы вместо последующего вызова методов только что созданного объекта. Новый класс HTMLDocument
имеет три именованных конструктора:
HTMLDocument::createEmpty();
HTMLDocument::createFromFile($path);
HTMLDocument::createFromString($html);
Вот их полные сигнатуры:
public static function createEmpty(string $encoding = "UTF-8"): HTMLDocument;
public static function createFromFile(string $path, int $options = 0, ?string $override_encoding = null): HTMLDocument;
public static function createFromString(string $source, int $options = 0, ?string $override_encoding = null): HTMLDocument;
Для переменной $options
доступны следующие опции:
LIBXML_HTML_NOIMPLIED
LIBXML_COMPACT
LIBXML_NOERROR
\Dom\NO_DEFAULT_NS
Переменная $override_encoding
используется для переопределения неявных процедур определения кодировки, определяемых спецификацией HTML-парсера. Это может быть удобно, когда документ загружается вручную.
Объекты DOM
Ещё одно удачное конструктивное решение заключается в том, что итоговый HTMLDocument
содержит список узлов DOM, которые по-прежнему представлены старыми объектами DOMNode
. Фактически, все объекты-значения, связанные с DOM, остаются неизменными, независимо от того, какой парсер используется. Это означает, что можно переключиться со старого \DOMDocument
на новый \Dom\HTMLDocument
, и весь базовый код — теоретически — должен продолжать работать.
Этот RFC также добавляет псевдонимы для этих классов объектов-значений в пространство имён \Dom
, подготавливая возможный путь обновления в случае, если старый код однажды потребуется перенести. Так, например, \DOMElement
будет также доступен как \Dom\Element
, \DOMAttribute
как \Dom\Attribute
и т.д. Обе версии могут использоваться как взаимозаменяемые.
Хоть и с небольшим опозданием, думаю, что это очень хорошее дополнение к PHP. У меня определённо есть несколько сценариев его использования! А какие у вас соображения?