Ayuda con StringRegExp en una web

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Ayuda con StringRegExp en una web

Mensaje 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!
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Ayuda con StringRegExp en una web

Mensaje 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.
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Ayuda con StringRegExp en una web

Mensaje 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)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con StringRegExp en una web

Mensaje por arkcrew »

Mushisimas gracias Jamaro, me funcionó a la perfección!!

Saludos
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Ayuda con StringRegExp en una web

Mensaje 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 :(
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda con StringRegExp en una web

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Ayuda con StringRegExp en una web

Mensaje 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 ...
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ayuda con StringRegExp en una web

Mensaje 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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder