solo regulares regular probar numeros letras expresiones expresion especiales espacio ejemplos caracteres blanco alfanumerico php html regex

php - numeros - probar expresiones regulares java



¿Usando expresiones regulares para extraer la primera fuente de imagen de los códigos html? (10)

Asumo que todos tus src = tienen "alrededor de la url

<img[^>]+src=/"([^/"]+)/"

Las otras respuestas publicadas aquí hacen otras suposiciones acerca de su código.

Me gustaría saber cómo se puede lograr esto.

Supongamos que hay un montón de código html que contiene tablas, divs, imágenes, etc.

Problema: ¿Cómo puedo obtener coincidencias de todas las apariciones? Más sobre, para ser específico, ¿cómo puedo obtener la fuente de la etiqueta img (src =?).

ejemplo:

<img src="http://example.com/g.jpg" alt="" />

¿Cómo puedo imprimir http://example.com/g.jpg en este caso? Quiero asumir que también hay otras etiquetas en el código html como mencioné, y posiblemente más de una imagen. ¿Sería posible tener una matriz de todas las fuentes de imágenes en código html?

Sé que esto se puede lograr de una forma u otra con expresiones regulares, pero no puedo entenderlo.

Cualquier ayuda es muy apreciada.


Esto funciona para mí:

preg_match(''@<img.+src="(.*)".*>@Uims'', $html, $matches); $src = $matches[1];


Estoy de acuerdo con Andrew Moore. Usar el DOM es mucho, mucho mejor. La colección de imágenes HTML DOM le devolverá una referencia a todos los objetos de imagen.

Digamos en tu cabecera que tienes,

<script type="text/javascript"> function getFirstImageSource() { var img = document.images[0].src; return img; } </script>

y luego en tu cuerpo tienes,

<script type="text/javascript"> alert(getFirstImageSource()); </script>

Esto devolverá la fuente de la primera imagen. También puede recorrerlos a lo largo de las líneas de, (en la sección de encabezado)

function getAllImageSources() { var returnString = ""; for (var i = 0; i < document.images.length; i++) { returnString += document.images[i].src + "/n" } return returnString; }

(en cuerpo)

<script type="text/javascript"> alert(getAllImageSources()); </script>

Si está utilizando JavaScript para hacer esto, recuerde que no puede ejecutar su función en bucle a través de la colección de imágenes en su encabezado. En otras palabras, no puedes hacer algo como esto,

<script type="text/javascript"> function getFirstImageSource() { var img = document.images[0].src; return img; } window.onload = getFirstImageSource; //bad function </script>

porque esto no funcionará Las imágenes no se han cargado cuando se ejecuta el encabezado y, por lo tanto, obtendrás un resultado nulo.

Esperemos que esto pueda ayudar de alguna manera. Si es posible, haría uso del DOM. Encontrarás que una buena parte de tu trabajo ya está hecho para ti.


No sé si DEBES usar expresiones regulares para obtener tus resultados. Si no, puedes probar simpleXML y XPath, que serían mucho más confiables para tu objetivo:

Primero, importe el HTML en un objeto de documento DOM. Si obtienes errores, desactiva los errores para esta parte y asegúrate de volver a activarlos después:

$dom = new DOMDocument(); $dom -> loadHTMLFile("filename.html");

A continuación, importe el DOM a un objeto simpleXML, así:

$xml = simplexml_import_dom($dom);

Ahora puede usar algunos métodos para obtener todos los elementos de su imagen (y sus atributos) en una matriz. XPath es el que prefiero, porque he tenido mejor suerte al atravesar el DOM con él:

$images = $xml -> xpath(''//img/@src'');

Esta variable ahora puede tratarse como una matriz de sus URL de imagen:

foreach($images as $image) { echo ''<img src="$image" /><br /> ''; }

Presto, todas tus imágenes, ninguna de las gordas.

Aquí está la versión no anotada de lo anterior:

$dom = new DOMDocument(); $dom -> loadHTMLFile("filename.html"); $xml = simplexml_import_dom($dom); $images = $xml -> xpath(''//img/@src''); foreach($images as $image) { echo ''<img src="$image" /><br /> ''; }


Puedes probar esto:

preg_match_all("/<img/s+src=/"(.+)/"/i", $html, $matches); foreach ($matches as $key=>$value) { echo $key . ", " . $value . "<br>"; }


Realmente creo que no se puede predecir todos los casos en expresiones regulares.

La mejor manera es usar el DOM con el DOMDocument y xpath de la clase PHP5 . Es la forma más limpia de hacer lo que quieres.

$dom = new DOMDocument(); $dom->loadHTML( $htmlContent ); $xml = simplexml_import_dom($dom); $images = $xml -> xpath(''//img/@src'');


Si bien las expresiones regulares pueden ser buenas para una gran variedad de tareas, me parece que generalmente se quedan cortas al analizar HTML DOM. El problema con HTML es que la estructura de su documento es tan variable que es difícil de extraer con precisión (y con precisión me refiero a una tasa de éxito del 100% sin falsos positivos) para extraer una etiqueta.

Lo que te recomiendo que hagas es usar un analizador DOM como SimpleHTML y usarlo como tal:

function get_first_image($html) { require_once(''SimpleHTML.class.php'') $post_html = str_get_html($html); $first_img = $post_html->find(''img'', 0); if($first_img !== null) { return $first_img->src; } return null; }

Algunos pueden pensar que esto es una exageración, pero al final, será más fácil de mantener y también permite una mayor extensibilidad. Por ejemplo, usando el analizador DOM, también puedo obtener el atributo alt.

Se podría idear una expresión regular para lograr el mismo objetivo, pero se limitaría de tal manera que obligaría a que el atributo alt esté detrás del src o lo contrario, y superar esta limitación agregaría más complejidad a la expresión regular.

Además, considere lo siguiente. Para hacer coincidir correctamente una etiqueta <img> usando expresiones regulares y para obtener solo el atributo src (capturado en el grupo 2), necesita la siguiente expresión regular:

</s*?img/s+[^>]*?/s*src/s*=/s*(["''])((//?+.)*?)/1[^>]*?>

Y luego otra vez, lo anterior puede fallar si:

  • El atributo o el nombre de la etiqueta está en mayúsculas y el modificador i no se utiliza.
  • Las comillas no se utilizan alrededor del atributo src .
  • Otro atributo entonces src usa el carácter > en algún lugar de su valor.
  • Alguna otra razón no la he previsto.

Así que de nuevo, simplemente no use expresiones regulares para analizar un documento dom.

EDITAR: Si quieres todas las imágenes:

function get_images($html){ require_once(''SimpleHTML.class.php'') $post_dom = str_get_dom($html); $img_tags = $post_dom->find(''img''); $images = array(); foreach($img_tags as $image) { $images[] = $image->src; } return $images; }


Usa esto, es más efectivo:

preg_match_all(''/<img [^>]*src=["|/']([^"|/']+)/i'', $html, $matches); foreach ($matches[1] as $key=>$value) { echo $value."<br>"; }

Ejemplo:

$html = '' <ul> <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li> <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li> <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li> <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value1.jpg" /> <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li> <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value2.jpg" /> <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li> <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value3.jpg" /> </ul> <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="res/upload.jpg" /> <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li> <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li> <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li> <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value4.jpg" /> <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li> <img src="value5.jpg" /> <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li> <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value6.jpg" /> ''; preg_match_all(''/<img .*src=["|/']([^"|/']+)/i'', $html, $matches); foreach ($matches[1] as $key=>$value) { echo $value."<br>"; }

Salida:

value1.jpg value2.jpg value3.jpg res/upload.jpg value4.jpg value5.jpg value6.jpg


Ya que no te preocupa validar el HTML, puedes intentar usar strip_tags() en el texto primero para borrar la mayor parte del texto.

Entonces puedes buscar una expresión como

"//<img .+ ///>/i"

Las barras invertidas escapan a caracteres especiales como <,>, /. . + insiste en que haya 1 o más caracteres dentro de la etiqueta img. Puede capturar parte de la expresión colocando paréntesis a su alrededor. por ejemplo, (. +) captura la parte central de la etiqueta img.

Cuando decida qué parte del medio desea capturar específicamente, puede modificar (. +) A algo más específico.


<?php /* PHP Simple HTML DOM Parser @ http://simplehtmldom.sourceforge.net */ require_once(''simple_html_dom.php''); $html = file_get_html(''http://example.com''); $image = $html->find(''img'')[0]->src; echo "<img src=''{$image}''/>"; // BOOM!

PHP Simple HTML DOM Parser hará el trabajo en pocas líneas de código.