{"id":231776,"date":"2022-12-29T16:15:00","date_gmt":"2022-12-29T13:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231776"},"modified":"2022-12-29T16:16:57","modified_gmt":"2022-12-29T13:16:57","slug":"como-remover-imagens-com-domdocument","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-remover-imagens-com-domdocument\/","title":{"rendered":"Como remover imagens com DOMDocument"},"content":{"rendered":"<p>Escrevi sobre DOMDocument em alguns outros posts (<a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-manipular-o-dom-usando-php\/\" title=\"1\">1<\/a>, <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/modificar-conteineres-de-imagem-no-lado-do-servidor-no-wordpress\/\" title=\"2\">2<\/a>, <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/adicionando-atributos-de-imagem-personalizados-do-wordpress\/\" title=\"3\">3<\/a> para compartilhar alguns), mas continuo achando \u00fatil de diferentes maneiras.<\/p>\n<p>Lembre-se, DOMDocument \u00e9 uma classe em PHP que nos permite manipular o documento HTML antes de renderiz\u00e1-lo no navegador.<\/p>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/class.domdocument.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Do manual<\/a> :<\/p>\n<blockquote>\n<p>Representa um documento HTML ou XML inteiro; serve como a raiz da \u00e1rvore do documento.<\/p>\n<\/blockquote>\n<p>Sempre que penso em trabalhar com a <code>saveHTML<\/code>fun\u00e7\u00e3o, penso na necessidade de serializar as novas informa\u00e7\u00f5es em um arquivo ou outro fluxo de sa\u00edda antes de envi\u00e1-las ao navegador.<\/p>\n<p>Mas n\u00e3o temos que fazer isso. Pode ser feito na mem\u00f3ria.<\/p>\n<p>Caso em quest\u00e3o: em um projeto, preciso encontrar todos os elementos de imagem em um documento. Se a imagem n\u00e3o tiver um URL de origem v\u00e1lido, preciso substituir o atributo de origem ou remov\u00ea-lo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159632-61e6f91ebff9c.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-159632-61e6f91ebff9c.png\" alt=\"Como remover imagens com DOMDocument\"><\/a><\/p>\n<p>Para os prop\u00f3sitos deste exemplo, suponha o seguinte<\/p>\n<ul>\n<li><code>isValidImage<\/code>\u00e9 uma fun\u00e7\u00e3o respons\u00e1vel por verificar se o atributo de origem especificado resolve para um URL v\u00e1lido,<\/li>\n<li>Que estou definindo o <code>src<\/code>atributo para uma string vazia em vez de uma imagem de espa\u00e7o reservado para manter o c\u00f3digo simples,<\/li>\n<li>E devolvo o resultado para o que for renderizado no template ou no parcial.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/35581dce7a46c4a78f5168d0291aa961#file-00-replace-image-src-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Eu comentei o c\u00f3digo<\/a>, ent\u00e3o deve ser f\u00e1cil o suficiente para seguir este exemplo:<\/p>\n<pre><code>&lt;?php\n\n\/\/ Instantiate a DOMDocument object and load the incoming $description HTML.\n$domDocument = new DOMDocument();\n$domContent = $domDocument-&gt;loadHTML(mb_convert_encoding($description, 'HTML-ENTITIES'));\n\n\/\/ Find all of the images in the HTML.\n$images = $domDocument-&gt;getElementsByTagName('img');\n\n\/\/ If there are images, then iterate through each of them.\nif (0 !== count($images)) {\n    $urlPrefix = $this-&gt;getUrlPrefix(); \/\/ A helper function for getting the URL prefix.\n    foreach ($images as $image) {\n        $image-&gt;setAttribute(\n            'src',\n            $urlPrefix.$image-&gt;getAttribute('src')\n        );\n\n        \/\/ If the image's source results in a 404 status code, set the `src` to an empty string.\n        if (!$this-&gt;isValidImage($image-&gt;getAttribute('src'))) {\n            $image-&gt;setAttribute('src', '');\n        }\n    }\n}\n\n\/\/ Save the changed document and send it to the front-end.\nreturn $domDocument-&gt;saveHTML();<\/code><\/pre>\n<p>Observe que h\u00e1 v\u00e1rias maneiras de melhorar o c\u00f3digo acima (como retornar antecipadamente se nenhuma imagem for encontrada), mas o objetivo \u00e9 mostrar como substituir o <code>src<\/code>atributo se a URL n\u00e3o for resolvida corretamente. Assim, removendo imagens com DOMDocument.<\/p>\n<p>Se voc\u00ea estiver interessado em saber como determinar se um URL \u00e9 v\u00e1lido, <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-curl-para-determinar-se-o-url-especificado-e-uma-pagina-valida\/\" title=\"este artigo\">este artigo<\/a> pode ser \u00fatil.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O objetivo \u00e9 mostrar como substituir o atributo src se a URL n\u00e3o resolver corretamente. Assim, como remover imagens com DOMDocument.<\/p>\n","protected":false},"author":1,"featured_media":236999,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,753,722,837,806,846,867],"tags":[1170],"class_list":["post-231776","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-guia-para-iniciantes","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231776"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231776\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236999"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}