Я писал о DOMDocument в нескольких других сообщениях (1, 2, 3, чтобы поделиться некоторыми), но я продолжаю находить его полезным по-разному.
Помните, DOMDocument — это класс в PHP, который позволяет нам манипулировать HTML-документом до его отображения в браузере.
Представляет весь документ HTML или XML; служит корнем дерева документов.
Всякий раз, когда я думаю о работе с saveHTMLфункцией, я думаю о необходимости сериализовать новую информацию в файл или другой поток вывода перед отправкой ее в браузер.
Но мы не обязаны этого делать. Это можно сделать по памяти.
Показательный пример: в проекте мне нужно найти все элементы изображения в документе. Если у изображения нет действительного URL-адреса источника, мне нужно либо заменить исходный атрибут, либо удалить его.
Для целей этого примера предположим следующее
isValidImageэто функция, отвечающая за проверку того, разрешается ли указанный исходный атрибут допустимым URL-адресом,- Что я задаю
srcатрибут пустой строкой, а не изображением-заполнителем, чтобы упростить код, - И я возвращаю результат тому, что будет отображаться в шаблоне или партиале.
Я прокомментировал код, поэтому для этого примера должно быть достаточно легко следовать:
<?php
// Instantiate a DOMDocument object and load the incoming $description HTML.
$domDocument = new DOMDocument();
$domContent = $domDocument->loadHTML(mb_convert_encoding($description, 'HTML-ENTITIES'));
// Find all of the images in the HTML.
$images = $domDocument->getElementsByTagName('img');
// If there are images, then iterate through each of them.
if (0 !== count($images)) {
$urlPrefix = $this->getUrlPrefix(); // A helper function for getting the URL prefix.
foreach ($images as $image) {
$image->setAttribute(
'src',
$urlPrefix.$image->getAttribute('src')
);
// If the image's source results in a 404 status code, set the `src` to an empty string.
if (!$this->isValidImage($image->getAttribute('src'))) {
$image->setAttribute('src', '');
}
}
}
// Save the changed document and send it to the front-end.
return $domDocument->saveHTML();
Обратите внимание, что приведенный выше код можно улучшить несколькими способами (например, вернуться раньше, если изображения не найдены), но цель состоит в том, чтобы показать, как заменить srcатрибут, если URL-адрес не разрешается должным образом. Таким образом, удаление изображений с помощью DOMDocument.
Если вам интересно, как определить, действителен ли URL-адрес, эта статья может оказаться полезной.
