Поддержка 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_NOIMPLIEDLIBXML_COMPACTLIBXML_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. У меня определённо есть несколько сценариев его использования! А какие у вас соображения?