Como remover imagens com DOMDocument
Escrevi sobre DOMDocument em alguns outros posts (1, 2, 3 para compartilhar alguns), mas continuo achando útil de diferentes maneiras.
Lembre-se, DOMDocument é uma classe em PHP que nos permite manipular o documento HTML antes de renderizá-lo no navegador.
Representa um documento HTML ou XML inteiro; serve como a raiz da árvore do documento.
Sempre que penso em trabalhar com a saveHTMLfunção, penso na necessidade de serializar as novas informações em um arquivo ou outro fluxo de saída antes de enviá-las ao navegador.
Mas não temos que fazer isso. Pode ser feito na memória.
Caso em questão: em um projeto, preciso encontrar todos os elementos de imagem em um documento. Se a imagem não tiver um URL de origem válido, preciso substituir o atributo de origem ou removê-lo.
Para os propósitos deste exemplo, suponha o seguinte
isValidImageé uma função responsável por verificar se o atributo de origem especificado resolve para um URL válido,- Que estou definindo o
srcatributo para uma string vazia em vez de uma imagem de espaço reservado para manter o código simples, - E devolvo o resultado para o que for renderizado no template ou no parcial.
Eu comentei o código, então deve ser fácil o suficiente para seguir este exemplo:
<?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();
Observe que há várias maneiras de melhorar o código acima (como retornar antecipadamente se nenhuma imagem for encontrada), mas o objetivo é mostrar como substituir o srcatributo se a URL não for resolvida corretamente. Assim, removendo imagens com DOMDocument.
Se você estiver interessado em saber como determinar se um URL é válido, este artigo pode ser útil.
