2010-02-01 20 views
10

Estoy intentando ejecutar preg_match para extraer el atributo SRC de la primera etiqueta IMG en un artículo (en este caso, almacenado en $ row-> introtexto).Atributo SRC coincidente de la etiqueta IMG usando preg_match

preg_match('/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\']*)/i', $row->introtext, $matches); 

En vez de conseguir algo así como

images/stories/otakuzoku1.jpg 

de

<img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku's store" /> 

me sale solo

0 

La expresión regular debe ser correcto, pero no puedo decir por qué parece coincidir con el atributo de frontera te y no el atributo src.

Alternativamente, si ha tenido la paciencia de leer hasta aquí sin saltarse directamente al campo de respuesta y escribir 'utilizar un analizador HTML/XML', se puede recomendar un buen tutorial ya que tengo problemas para encontrarlo uno en todo lo que es aplicable a PHP 4.

PHP 4.4.7

Respuesta

28

Su expresión es incorrecta. Proveedores:

preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', $row->introtext, $matches); 

Nota de la supresión de los corchetes alrededor img src y algunos otros y limpiezas.

+1

Esto hizo el truco. No es la solución "ideal" para analizar realmente el HTML, sino la única solución que funciona y proporciona el resultado necesario. ¡Gracias! – KyokoHunter

+2

como nota al margen, $ coincidencias [0] contiene la etiqueta IMG completa, y $ coincidencias [1] contiene el URI de origen. –

2

Probar:

include ("htmlparser.inc"); // from: http://php-html.sourceforge.net/ 

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku\'s store" /> noise <img src="das" /> foo'; 

$parser = new HtmlParser($html); 

while($parser->parse()) { 
    if($parser->iNodeName == 'img') { 
     echo $parser->iNodeAttributes['src']; 
     break; 
    } 
} 

que producirá:

images/stories/otakuzoku1.jpg 

Se debe trabajar con PHP 4.x.

+0

+1, buena idea, solo estaba redactando algo para ese efecto usando ese viejo analizador DOM :) – karim79

+0

Parece útil - lo intentaré e informaré aquí. – KyokoHunter

+0

Algunos problemas para que htmlparser.inc funcione. El mensaje de error dice que la clase ya está iniciada, pero no es así. Voy a esperar una actualización de proveedor a PHP 5 ... – KyokoHunter

5

Aquí está una manera de hacerlo con funciones integradas (PHP> = 4):

$parser = xml_parser_create(); 
xml_parse_into_struct($parser, $html, $values); 
foreach ($values as $key => $val) { 
    if ($val['tag'] == 'IMG') { 
     $first_src = $val['attributes']['SRC']; 
     break; 
    } 
} 

echo $first_src; // images/stories/otakuzoku1.jpg 
1

La expresión regular que utilicé era mucho más simple. Mi código asume que la cadena que se pasa a ella contiene exactamente una etiqueta img con ningún otro marcado:

$pattern = '/src="([^"]*)"/'; 

Ver mi respuesta aquí para obtener más información: How to extract img src, title and alt from html using php?

+0

"exactamente una etiqueta img sin otras marcas"? Es un caso bastante específico, ¿no ?, quizás demasiado específico para casi todos: [ – Andrew

1

Si es necesario utilizar preg_match() sí, probar este :

preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches); 
Cuestiones relacionadas