{"id":231390,"date":"2022-12-29T16:27:00","date_gmt":"2022-12-29T13:27:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231390"},"modified":"2022-12-29T16:31:40","modified_gmt":"2022-12-29T13:31:40","slug":"como-eliminar-imagenes-con-domdocument","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-eliminar-imagenes-con-domdocument\/","title":{"rendered":"C\u00f3mo eliminar im\u00e1genes con DOMDocument"},"content":{"rendered":"<p>He escrito sobre DOMDocument en algunas otras publicaciones (<a href=\"https:\/\/wordpress.mediadoma.com\/es\/como-manipular-el-dom-usando-php\/\" title=\"1\">1<\/a>, <a href=\"https:\/\/wordpress.mediadoma.com\/es\/modificar-contenedores-de-imagenes-en-el-lado-del-servidor-en-wordpress\/\" title=\"2\">2<\/a>, <a href=\"https:\/\/wordpress.mediadoma.com\/es\/agregar-atributos-de-imagen-de-wordpress-personalizados\/\" title=\"3\">3<\/a> para compartir algunas) pero sigo encontr\u00e1ndolo \u00fatil de diferentes maneras.<\/p>\n<p>Recuerda, DOMDocument es una clase en PHP que nos permite manipular el documento HTML antes de mostrarlo en el navegador.<\/p>\n<p><a href=\"https:\/\/www.php.net\/manual\/en\/class.domdocument.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Del manual<\/a> :<\/p>\n<blockquote>\n<p>Representa un documento HTML o XML completo; sirve como la ra\u00edz del \u00e1rbol del documento.<\/p>\n<\/blockquote>\n<p>Cada vez que pienso en trabajar con la <code>saveHTML<\/code>funci\u00f3n, pienso en la necesidad de serializar la nueva informaci\u00f3n en un archivo u otro flujo de salida antes de enviarlo al navegador.<\/p>\n<p>Pero no tenemos que hacer eso. Se puede hacer en la memoria.<\/p>\n<p>Caso en cuesti\u00f3n: en un proyecto, necesito encontrar todos los elementos de imagen en un documento. Si la imagen no tiene una URL de origen v\u00e1lida, debo reemplazar el atributo de origen o eliminarlo.<\/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=\"C\u00f3mo eliminar im\u00e1genes con DOMDocument\"><\/a><\/p>\n<p>Para los prop\u00f3sitos de este ejemplo, suponga lo siguiente<\/p>\n<ul>\n<li><code>isValidImage<\/code>es una funci\u00f3n que es responsable de verificar si el atributo fuente especificado se resuelve en una URL v\u00e1lida,<\/li>\n<li>Que estoy configurando el <code>src<\/code>atributo en una cadena vac\u00eda en lugar de una imagen de marcador de posici\u00f3n para mantener el c\u00f3digo simple,<\/li>\n<li>Y devuelvo el resultado a lo que sea que se renderice en la plantilla o en el 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\">He comentado el c\u00f3digo<\/a>, por lo que deber\u00eda ser lo suficientemente f\u00e1cil de seguir para este ejemplo:<\/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>Tenga en cuenta que hay varias formas de mejorar el c\u00f3digo anterior (como volver antes si no se encuentran im\u00e1genes), pero el prop\u00f3sito es mostrar c\u00f3mo reemplazar el <code>src<\/code>atributo si la URL no se resuelve correctamente. Por lo tanto, eliminar im\u00e1genes con DOMDocument.<\/p>\n<p>Si est\u00e1 interesado en c\u00f3mo determinar si una URL es v\u00e1lida, <a href=\"https:\/\/wordpress.mediadoma.com\/es\/uso-de-curl-para-determinar-si-la-url-especificada-es-una-pagina-valida\/\" title=\"este art\u00edculo\">este art\u00edculo<\/a> puede resultarle \u00fatil.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El prop\u00f3sito es mostrar c\u00f3mo reemplazar el atributo src si la URL no se resuelve correctamente. Por lo tanto, c\u00f3mo eliminar im\u00e1genes con 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":[892,716,747,831,800,840,861],"tags":[1172],"class_list":["post-231390","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-fuente-abierta","category-guia-para-principiantes","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=231390"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231390\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236999"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}