Página 1 de 1

Ayuda con StringRegExp en una web

Publicado: 13 Nov 2011, 12:50
por arkcrew
Hola a todos,

Como verán, esta función siempre se me resiste ya que no comprendo del todo su funcionamiento, sé que la función extrae los valores asociados entre dos parámetros, pero no entiendo del todo cuando usar los (.*?) y demás cosas que cita la ayuda..

El problema que tengo, es que al sacar los enlaces de una página web cuya estructura es muy simple:

<li ><a title="Escuchar Same in the end - sublime" href="listen/1f743df/same-in-the-end-sublime"><span class="song">Same in the end</span> - <span class="group">sublime</span></a><a class="play" lang="en" xml:lang="en" title="Escuchar en una ventana independiente" onclick="window.open('http://www.goear.com/listen_popup.php?v ... izable=yes')" href="javascript:void(0);"><img alt="Play" src="http://www.goear.com/lib/img/popup.png" /></a><p class="comment">sublime - same in the end</p><span class="length">2:37</span></li>

La estructura se repite para cada canción así que es relativamente facil obtener resultados:

$artistacancion = StringRegExp($html, '<span class="group">(.*?)</span>', 3)
$TituloCancion = StringRegExp($html, '<span class="song">(.*?)</span>', 3)
$linkCancion = StringRegExp($html, '<a title="(.*?)" href="(.*?)"><span class="song">', 3)

Esas son mis tres variables, de las cuales la primera y la segunda funcionan de lujo, el problema está en el link, SOLO necesito asociar la parte del href despreciando así el valor contenido en title se desprecia, he probado a poner solo href="(.*?)"><span class="song">', 3) pero se lia bastante el código...
otra cosa que se me ocurrió fué
If StringLeft($linkCancion[$n], 7) <> "listen/" Then
$link = $linkCancion[$n + 1]
EndIf
pero es una chapuza que repite los links dobles y da un resultado erróneo...

Ayuda porfavor

Gracias!

Saludos!

Re: Ayuda con StringRegExp en una web

Publicado: 13 Nov 2011, 13:33
por jamaro
arkcrew, ¿el resultado que buscas se obtiene con esto?

<a title=".*?" href="(.*?)"><span class="song">

Con las expresiones regulares, lo que tienes entre paréntesis es lo que te devuelve. Si el primer .*? lo dejas sin paréntesis, no te lo devolverá, aunque lo tiene en cuenta en la expresión a buscar.

Saludos.

Re: Ayuda con StringRegExp en una web

Publicado: 13 Nov 2011, 13:36
por jamaro
Y si el enlace siempre empieza por listen, puedes poner:

listen/(.*?)"><span class="song">

y añadirele listen/ al asignar la variable.

$linkCancion = "listen/" & StringRegExp($html, 'listen/(.*?)"><span class="song">', 3)

Re: Ayuda con StringRegExp en una web

Publicado: 13 Nov 2011, 22:38
por arkcrew
Mushisimas gracias Jamaro, me funcionó a la perfección!!

Saludos

Re: Ayuda con StringRegExp en una web

Publicado: 21 Feb 2012, 00:35
por avechuche
jamaro escribió:Y si el enlace siempre empieza por listen, puedes poner:

listen/(.*?)"><span class="song">

y añadirele listen/ al asignar la variable.

$linkCancion = "listen/" & StringRegExp($html, 'listen/(.*?)"><span class="song">', 3)

Yo hice algo parecido con esto pero no me funciono, osea quiero listar todos los link que se encuentran dentro de una cadena. arrancan con "http://" y terminan con ".rar". Con eso no hay problema. Ahora el problema es que me borra el "http://" y el ".rar", probe agregando a la variable lo que falta, pero no me funciona, osea, no me devuelve ningun array.

Código: Seleccionar todo

$aArray = "http://" & StringRegExp("http://www.google.com.rar", "http://(.*?).rar", 3) & ".rar"
OJO: Yo interpreto, segun el ejemplo de arriba, que el "http://" y el ".rar" que yo anide se va a incorporar a los link una vez que estos fueron encontrados, pero no anda :(

Re: Ayuda con StringRegExp en una web

Publicado: 21 Feb 2012, 09:40
por Ximorro
No te devuelve ningún array porque el operador & no puede operar con arrays. Le estás diciendo que concatene una cadena con un array y eso no se puede hacer directamente.
Lo que podrías hacer es ir recorriendo el array y hacer la concatenación con todos los resultados, pero también se puede hacer directamente con la ER.
El problema es que al poner paréntesis a "(.*?)" estás diciendo que quieres capturar eso, por eso te ignora lo demás. Cuando quieres usar paréntesis pero no crear un grupo capturable se indica con ?:
Así queda:
http://(?:.*?)\.rar
Eso te devolverá todo, incluido el "http://" y el ".rar", no tienes que añadirlo a mano.

Por cierto, fíjate que el punto hay que escaparlo con "\", porque en ER un punto significa "cualquier carácter" y tú quieres expresamente el carácter punto.

Re: Ayuda con StringRegExp en una web

Publicado: 21 Feb 2012, 20:48
por avechuche
Ximorro escribió:No te devuelve ningún array porque el operador & no puede operar con arrays. Le estás diciendo que concatene una cadena con un array y eso no se puede hacer directamente.
Lo que podrías hacer es ir recorriendo el array y hacer la concatenación con todos los resultados, pero también se puede hacer directamente con la ER.
El problema es que al poner paréntesis a "(.*?)" estás diciendo que quieres capturar eso, por eso te ignora lo demás. Cuando quieres usar paréntesis pero no crear un grupo capturable se indica con ?:
Así queda:
http://(?:.*?)\.rar
Eso te devolverá todo, incluido el "http://" y el ".rar", no tienes que añadirlo a mano.

Por cierto, fíjate que el punto hay que escaparlo con "\", porque en ER un punto significa "cualquier carácter" y tú quieres expresamente el carácter punto.
Esto si anda perfecto :) Muchas gracias!! y mas por las explicaciones ...

Re: Ayuda con StringRegExp en una web

Publicado: 22 Feb 2012, 09:29
por Ximorro
De nada, me alegro de que sirvan las explicaciones porque lo mío me cuesta ponerlas, que a veces me enrollo que no veas :smt005