2011-09-20 10 views
22

Estoy tratando de obtener la primera imagen de cada una de mis publicaciones. Este código a continuación funciona muy bien si solo tengo una imagen. Pero si tengo más de una, me da una imagen, pero no siempre la primera.Obteniendo la primera imagen en una cadena con php

Realmente solo quiero la primera imagen. Una gran cantidad de veces que la segunda imagen es un botón situado junto

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 

preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $texthtml, $matches); 
$first_img = $matches [1] [0]; 

ahora puedo aprovechar esta "$ first_img" y pegarlo en la parte delantera de la breve descripción

<img alt="Sara" title="Sara" src="<?php echo $first_img;?>"/> 

Respuesta

38

Si sólo necesita la primera etiqueta de origen, preg_match debe hacer en lugar de preg_match_all, hace este trabajo para usted?

<?php 
    $texthtml = 'Who is Sara Bareilles on Sing Off<br> 
    <img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
    <img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
    preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $texthtml, $image); 
    echo $image['src']; 
?> 
+1

Extraño, lo reemplacé con tu código y todavía obtengo la segunda imagen – MHowey

+0

¿Podrías pegar aquí el html que lo está haciendo fallar porque como Kelsey dijo que tu código también debería funcionar, sería más fácil seguirlo si tenemos un ejemplo que falla. – derp

+12

¿No es codicioso tu código? Entonces, si la etiqueta alt viene después del src, también capturará eso. Necesitas '+?' En lugar de '+'. Entonces usted tiene: 'preg_match ('/ . +?) [\'"]. *>/I ', $ texthtml, $ image); ' –

1

¿Seguro la expresión regular es siempre coincidiendo con el primero? Intente imprimir la matriz cada vez que la llame para ver:

error_log(var_export($matches, true));

+0

Eso es mi problema. Siempre devuelve una imagen pero necesito que devuelva la primera imagen solo – MHowey

+0

Bueno, su código parece que debería funcionar (aunque no revisé la expresión regular). Está accediendo a la segunda matriz, que contiene los patrones capturados, y luego al primer elemento de esa matriz, que es la primera imagen. ¿Intentó imprimir todo el conjunto y asegurarse de que cuando vea la imagen incorrecta, la primera imagen también coincida? Apuesto a que no. –

5

No utilice regex para analizar html. utilizar un lib/html-clase de análisis, como phpquery:

require 'phpQuery-onefile.php'; 

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sarahehe" title="Saraxd" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
$pq = phpQuery::newDocumentHTML($texthtml); 
$img = $pq->find('img:first'); 
$src = $img->attr('src'); 
echo "<img alt='foo' title='baa' src='{$src}'>"; 

Descarga: http://code.google.com/p/phpquery/

+1

Gracias, pero lo último que quiero es agregar un montón de código para arreglar un pequeño problema de imagen.preg_match está bien para unas pocas líneas de html llamadas desde sql. Pero gracias por tomarse el tiempo para responder – MHowey

+1

sí, tal vez toneladas de códigos, pero en cuestión de rendimiento el phpQuery es mucho más rápido si se compara con expresiones regulares. –

+0

Estoy de acuerdo en la mayoría de los casos. Pero esto es para un blog pequeño que rinde 5 imágenes por página. Mantendré tu sugerencia en mente. Y realmente te agradezco / – MHowey

2

Después de probar una respuesta de aquí Using regular expressions to extract the first image source from html codes? Tengo mejores resultados con imágenes de enlaces rotos menos que la respuesta proporcionada aquí.

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

Para resultados más consistentes, utilice este objeto http://simplehtmldom.sourceforge.net/ que le permite manipular html. Se proporciona un ejemplo en la respuesta en el primer enlace que publiqué.

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; 
} 

Disfrute

Cuestiones relacionadas