PHP - Busqueda con preg_match

 
Vista:

Busqueda con preg_match

Publicado por Pegaso (3 intervenciones) el 30/09/2017 03:41:40
Tengo que buscar en una web algo en particular.
A continuacion pego parte del código que debo encontrar.

1
2
3
<div class="poster">
<a href="/title/tt0451279/mediaviewer/rm1404907776?ref_=tt_ov_i"> <img alt="Mujer Maravilla Poster" title="Mujer Maravilla Poster" src="https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@._V1_UX182_CR0,0,182,268_AL_.jpg" itemprop="image">
</a>    </div>

El codigo es muy parecido repitiendose en varios lados con distintos DIV pero solamente si existe el DIV "poster" es el que debo buscar y solo aparece una unica vez en todo el codigo.. O sea, debo preguntar primero por este DIV y luego necesito el contenido de SCR inmediato a este DIV
El contenido es todo el nombre del JPG con su extension obviamente.
Como serian los parametros ???

Para hacerlo mas dificil tambien necesito truncar el link desde el primer punto que aparezca... en este ejemplo seria
@@._V1
Todo lo que esta a la derecha del punto descartarlo, pero incluir la extensión que en este caso seria JPG.

Solo los expertos podrian sacarlo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 2.325
Plata
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Busqueda con preg_match

Publicado por kip (877 intervenciones) el 30/09/2017 06:24:50
Hola, si vas a trabajar con estructuras HTML es mejor optar por alguna libreria como https://github.com/sunra/php-simple-html-dom-parser o directamente con las clases que te ofrece PHP nativamente para esto como lo es http://php.net/manual/es/class.domdocument.php, aunque claramente es posible hacerlo con expresiones regulares para extraer el texto que deseas, intentemos primero con el parseo del HTML y buscando el nodo adecuado en este caso primero el div con clase poster y luego el elemento img dentro de este del cual extraeremos el atributo src, he hecho algo sencillo a ver si te funciona:

1
2
3
4
5
6
7
8
9
10
$dom = new DOMDocument;
$dom->loadHTML('<div class="poster">
<a href="/title/tt0451279/mediaviewer/rm1404907776?ref_=tt_ov_i"> <img alt="Mujer Maravilla Poster" title="Mujer Maravilla Poster" src="https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@._V1_UX182_CR0,0,182,268_AL_.jpg" itemprop="image">
</a>    </div>');
 
$finder = new DomXPath($dom);
$classname = 'poster';
$nodes = $finder->query("//div[contains(@class, '{$classname}')]");
 
$srcImage = $nodes[0]->getElementsByTagName('img')[0]->getAttribute('src');

En el ejemplo he usado directamente el HTML que colocaste arriba asi que si deseas probar esta opcion debes tener en cuenta que accedo al primer elemento del NodeList que me regresa el metodo query de la clase DomXPath.

El codigo me mostrara:

1
https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@._V1_UX182_CR0,0,182,268_AL_.jpg 

Ahora bien hagamoslo por medio de expresiones regulares que resulta en muchas menos lineas pero con cierta complicacion en la expresion:

1
2
3
4
5
6
7
$html = '<div class="poster">
<a href="/title/tt0451279/mediaviewer/rm1404907776?ref_=tt_ov_i"> <img alt="Mujer Maravilla Poster" title="Mujer Maravilla Poster" src="https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@._V1_UX182_CR0,0,182,268_AL_.jpg" itemprop="image">
</a>    </div>';
 
preg_match('~class=\"poster\".*(?<=src=\")(?P<src>[^\s]+)\"~s', $html, $match);
 
echo $match['src'];

De esta forma tendra tambien el src:

1
https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@._V1_UX182_CR0,0,182,268_AL_.jpg 

Para finalizar eliminar todo lo que esta a partir de ._V no ?

1
2
3
4
5
$srcImage = 'https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@._V1_UX182_CR0,0,182,268_AL_.jpg';
 
$srcImage = preg_replace('~(.*)(?:\.[^\.]+)(?=\.\w+$)~', '$1', $srcImage);
 
echo $srcImage;

1
https://images-na.ssl-images-amazon.com/images/M/MV5BNDFmZjgyMTEtYTk5MC00NmY0LWJhZjktOWY2MzI5YjkzODNlXkEyXkFqcGdeQXVyMDA4NzMyOA@@.jpg 
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Busqueda con preg_match

Publicado por Pegaso (3 intervenciones) el 01/11/2017 16:57:07
Hola. Me fui de viaje y me olvide de esto.
Probe pero no me funciono... es decir.. si tomo solo el codigo a buscar anda de 10, pero el codigo es mas grande de lo que dije.
Para que tengan una idea necesito buscar lo que ando pidiendo pero en la pagina
http://www.imdb.com/title/tt0451279
Que como veran es mas grande y puede dar falsos resultados.
Lo que quiero es la url del poster con el filtro que dije antes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar